使用C#的Xml文件无法获取该值

时间:2018-01-26 08:37:34

标签: c# xml xpath

这是我的xml文件

<?xml version="1.0" encoding="ASCII"?>
<Vitals>
<Vendor>General Electric Healthcare</Vendor>
<Model>Pro/Procare</Model>
    <Result name="Mean_arterial_pressure">
        <Value>86</Value>
        <Units name="mmHg"></Units>
        <Time_stamp year="2008" month="11" day="18" hour="12" minute="33" second="14"></Time_stamp>
    </Result>
    <Result name="Systolic_blood_pressure">
        <Value>130</Value>
        <Units name="mmHg"></Units>
        <Time_stamp year="2008" month="11" day="18" hour="12" minute="33" second="14"></Time_stamp>
    </Result>
    <Result name="Diastolic_blood_pressure">
        <Value>67</Value>
        <Units name="mmHg"></Units>
        <Time_stamp year="2008" month="11" day="18" hour="12" minute="33" second="14"></Time_stamp>
    </Result>
    <Result name="Pulse">
        <Value>73</Value>
        <Units name="BPM"></Units>
        <Method>blood_pressure</Method>
        <Time_stamp year="2008" month="11" day="18" hour="12" minute="33" second="14"></Time_stamp>
  </Result>
</Vitals>

这是我的源代码,我遇到了如何获取结果名称和值的问题?

private void btnReadXml_Click(object sender, EventArgs e)
{

    Hashtable h = new Hashtable();
    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.Load("C:\\dinamap.xml");


    XmlNodeList doc_results = xmlDoc.GetElementsByTagName("Vitals/Vendor/Model/Result[@name='Systolic_blood_pressure']");
    foreach (XmlNode pnode in doc_results)
    {
        foreach (XmlNode cnode in pnode.ChildNodes)
        {
            if (cnode.Name == "Value")
            {
                h.Add(pnode.Attributes["name"].InnerText + cnode.Name, cnode.Attributes["name"].InnerText);
            }
            else
            {
                h.Add(pnode.Attributes["name"].InnerText + "_" + cnode.Name, cnode.InnerText);
            }
        }      
    }
}

我可能知道我的代码有什么问题吗?始终无法获得价值 我需要从xml文件中获取值。

4 个答案:

答案 0 :(得分:1)

在第5行,您的xPath指定ModelVendor的孩子,而Vendor只包含一个字符串(<Vendor>General Electric Healthcare</Vendor>)。

此外,要使用xPath导航,我建议您使用SelectNodes函数。

请改为尝试:

XmlNodeList doc_results = xmlDoc.SelectNodes("/Vitals/Model/Result[@name='Systolic_blood_pressure']");

答案 1 :(得分:0)

您当前正在尝试检索子节点的“名称”attribute,在您的值节点的情况下它实际上没有。如果您使用cnode.Value,则可以获取文本注释的内容。

此外,Result Model的孩子,Vendor的孩子。您要么想要正确地让他们成为孩子,要么更改您为doc_results

设置的路径

答案 2 :(得分:0)

如果您使用LINQ to XML,这会更容易。

var doc = XDocument.Load("path/to/xml");

var results =
    from result in doc.Descendants("Result")
    select new
    {
        Name = (string) result.Attribute("name"),
        Value = (string) result.Element("Value"),
        Units = (string) result.Element("Units").Attribute("name")
    };

然后,您可以根据需要按名称进行过滤:

var sysBp = results.Single(x => x.Name == "Systolic_blood_pressure");

有关正常工作的演示,请参阅this fiddle

答案 3 :(得分:0)

&#13;
&#13;
private void btnReadXml_Click(object sender, EventArgs e)
        {

            var doc = XDocument.Load("C:\\dinamap.xml");

            var results = from result in doc.Descendants("Result")
                          select new
                          {
                              Name = (string)result.Attribute("name"),
                              Value = (string)result.Element("Value"),
                              Units = (string)result.Element("Units").Attribute("name")
                          };

            foreach (var result in results)
            {
                MessageBox.Show("{result.Name}: {result.Value} {result.Units}");

            }
         
        }
&#13;
&#13;
&#13;