使用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
相关产品推荐
相关产品推荐

