You need to enable JavaScript to run this app. C#使用XElement读取指定measInfo节点下的XML对应列值
优惠活动
大模型
产品
解决方案
定价
更多

C#使用XElement读取指定measInfo节点下的XML对应列值

目标数据读取实现方案

原代码的核心问题

  • 未适配XML默认命名空间:XML根节点声明了xmlns="measCollec",所有元素都属于该命名空间,直接使用纯元素名(如"measTypes")查找时无法匹配到节点
  • 查询逻辑错位:代码已经通过XNode.ReadFrom拿到了目标measInfo measInfoId="1526726702"的XElement实例,却还在该节点内部查找子级的measInfo节点,实际上measTypes、measValue都是该节点的直接子元素,原查询永远无法返回有效结果
  • 缺失列-索引映射:measTypes和measResults都是空格分隔的序列,必须按顺序建立列名和值位置的对应关系,才能按列名准确取到对应位置的值

实现流程

  1. 引入XML默认命名空间,直接定位到measInfoId="1526726702"的目标节点
  2. 读取measTypes的文本内容,拆分空格分隔的列名列表,建立「列名-索引位置」的映射,定位到需要读取的1526726740、1526728300两个列的下标
  3. 遍历目标节点下所有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.05 06:15:09