You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用C#读取XML文件无法获取值,求代码问题排查

解决C#读取XML时无法获取Result节点属性和Value值的问题

咱们来一步步排查你代码里的问题,你之所以拿不到想要的值,主要有几个关键错误:

问题分析

  • GetElementsByTagName不支持XPath路径:这个方法只能接收单个标签名称(比如"Result"),根本无法解析Vitals/Vendor/Model/Result[@name='Systolic_blood_pressure']这种带层级和条件的XPath表达式,这是最核心的问题。
  • XPath路径写错了:看你的XML结构,Vendor、Model和Result都是Vitals的直接子节点,不是嵌套关系!你写的Vitals/Vendor/Model/Result[...]相当于在找Vendor下面的Model下面的Result,这完全不存在,正确路径应该是Vitals/Result[@name='Systolic_blood_pressure']。
  • 读取Value节点的逻辑错误:Value节点本身没有name属性,你代码里去取cnode.Attributes["name"].InnerText肯定会报错,应该直接拿cnode.InnerText。
  • Hashtable的键值逻辑混乱:你原本想把Result的name和对应Value关联,但当前代码的键名和值的赋值逻辑都不符合预期,会导致存储的数据不对。

修正后的代码

如果你只想获取指定name的Result(比如"Systolic_blood_pressure"),可以用下面的代码:

private void btnReadXml_Click(object sender, EventArgs e)
{
    Hashtable h = new Hashtable();
    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.Load("C:\\dinamap.xml");

    // 使用SelectNodes执行正确的XPath查询,定位到指定name的Result节点
    XmlNodeList doc_results = xmlDoc.SelectNodes("Vitals/Result[@name='Systolic_blood_pressure']");

    foreach (XmlNode pnode in doc_results)
    {
        // 安全获取Result节点的name属性(避免空引用)
        string resultName = pnode.Attributes["name"]?.InnerText ?? string.Empty;
        if (string.IsNullOrEmpty(resultName)) continue;

        // 直接查找当前Result下的Value子节点
        XmlNode valueNode = pnode.SelectSingleNode("Value");
        if (valueNode != null)
        {
            // 将Result的名称和对应值存入Hashtable
            h.Add(resultName, valueNode.InnerText);
        }
    }

    // 测试输出结果
    foreach (DictionaryEntry entry in h)
    {
        MessageBox.Show($"{entry.Key}: {entry.Value}");
    }
}

如果想一次性获取所有Result节点的name和对应Value,只需要把XPath改成Vitals/Result即可:

private void btnReadXml_Click(object sender, EventArgs e)
{
    Hashtable h = new Hashtable();
    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.Load("C:\\dinamap.xml");

    // 获取所有Result节点
    XmlNodeList doc_results = xmlDoc.SelectNodes("Vitals/Result");

    foreach (XmlNode pnode in doc_results)
    {
        string resultName = pnode.Attributes["name"]?.InnerText ?? string.Empty;
        if (string.IsNullOrEmpty(resultName)) continue;

        XmlNode valueNode = pnode.SelectSingleNode("Value");
        if (valueNode != null)
        {
            h.Add(resultName, valueNode.InnerText);
        }
    }

    // 输出所有结果
    foreach (DictionaryEntry entry in h)
    {
        MessageBox.Show($"{entry.Key}: {entry.Value}");
    }
}

这样就能正确获取每个Result的name属性和对应的Value值啦!

内容的提问来源于stack exchange,提问作者walkercheah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:36:15