C#使用XElement读取指定measInfo节点下的XML对应列值
目标数据读取实现方案
原代码的核心问题
- 未适配XML默认命名空间:XML根节点声明了
xmlns="measCollec",所有元素都属于该命名空间,直接使用纯元素名(如"measTypes")查找时无法匹配到节点 - 查询逻辑错位:代码已经通过
XNode.ReadFrom拿到了目标measInfo measInfoId="1526726702"的XElement实例,却还在该节点内部查找子级的measInfo节点,实际上measTypes、measValue都是该节点的直接子元素,原查询永远无法返回有效结果 - 缺失列-索引映射:
measTypes和measResults都是空格分隔的序列,必须按顺序建立列名和值位置的对应关系,才能按列名准确取到对应位置的值
实现流程
- 引入XML默认命名空间,直接定位到
measInfoId="1526726702"的目标节点 - 读取
measTypes的文本内容,拆分空格分隔的列名列表,建立「列名-索引位置」的映射,定位到需要读取的1526726740、1526728300两个列的下标 - 遍历目标节点下所有
measValue行节点:- 从
measObjLdn属性中提取行标识(如Local Cell ID的取值) - 读取同节点下
measResults的文本内容,拆分空格分隔的数值列表,根据之前记录的下标取出对应列的值
- 从
可直接运行的示例代码
XNamespace ns = "measCollec"; // 对应XML声明的默认命名空间 // 加载XML并定位目标measInfo节点 var targetMeasInfo = XDocument.Load(path) .Descendants(ns + "measInfo") .First(el => el.Attribute("measInfoId")?.Value == "1526726702"); // 建立列名与索引的映射 var typeList = targetMeasInfo.Element(ns + "measTypes") .Value .Split(' ', StringSplitOptions.RemoveEmptyEntries) .ToList(); int targetColIndex1 = typeList.IndexOf("1526726740"); int targetColIndex2 = typeList.IndexOf("1526728300"); // 遍历所有行提取目标列值 var extractResult = targetMeasInfo.Descendants(ns + "measValue") .Select(row => { // 提取当前行的Local Cell ID标识 var measObjLdn = row.Attribute("measObjLdn")?.Value ?? ""; var cellIdPart = measObjLdn.Split(',') .Select(part => part.Trim()) .FirstOrDefault(part => part.StartsWith("Local Cell ID=")); var localCellId = cellIdPart?.Split('=')[1]; // 提取当前行的测量值列表 var valueList = row.Element(ns + "measResults") .Value .Split(' ', StringSplitOptions.RemoveEmptyEntries) .ToList(); return new { LocalCellId = localCellId, Column1526726740 = valueList[targetColIndex1], Column1526728300 = valueList[targetColIndex2] }; }) .ToList();
如果XML文件体积过大需要用流式读取避免内存占用过高,可以在你原本的XmlReader定位流程基础上,套用上面的列映射、值提取逻辑,核心只需要两点:一是查找元素时带上对应的命名空间,二是不要在目标measInfo节点内部查找不存在的子级measInfo元素。
匹配示例XML的输出结果
按照你提供的示例XML,代码运行后得到的结果为:
- Local Cell ID=10 对应取值:
43.596、390824 - Local Cell ID=11 对应取值:
46.596、390829 - Local Cell ID=12 对应取值:
49.596、390826
内容的提问来源于stack exchange,提问作者peter
相关产品推荐
相关产品推荐

