这是我的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文件中获取值。
答案 0 :(得分:1)
在第5行,您的xPath指定Model
是Vendor
的孩子,而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)
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;