我有以下代码
XmlDocument doc = new XmlDocument();
doc.Load(xmlFileName);
XmlNode deeperNodes =
doc.DocumentElement.ChildNodes[11].ChildNodes[1].ChildNodes[3].ChildNodes[1].ChildNodes[2];
XmlNode deeperetNodes =
doc.DocumentElement.ChildNodes[11].ChildNodes[1].ChildNodes[3].ChildNodes[1].ChildNodes[3];
string firstValue = deeperNodes.Attributes["count"].Value.ToString();
string secondValue = deeperetNodes.Attributes["count"].Value.ToString();
我正在阅读的XML是给定的标准,因此始终是正确的。是否有更好的更健全的方法来读取值?
更新:示例Xml
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Rn>
<Te>Fort</Te>
<Th></Th>
<Lh>c</Lh>
<Fe>C</Fe>
<Ue></Ue>
<RS></RS>
<RS></RS>
<RS></RS>
<RS> </RS>
<RS></RS>
<RS></RS>
<RS>
<Tl>New</Tl>
<SS>
<Tl>New</Tl>
<Description>A</Description>
<Text>The</Text>
<IssueListing>
<Refinement></Refinement>
<Chart ce="p">
<Axis>New</Axis>
<MajorAttribute>Anal</MajorAttribute>
<GroupingSection count="38">
<groupTl>Is</groupTl>
</GroupingSection>
<GroupingSection count="364">
<groupTl>Is</groupTl>
</GroupingSection>
</Chart>
</IssueListing>
</SS>
</RS>
</Rn>
答案 0 :(得分:1)
以下是使用XPath进行更强大解析的一些想法。这里的想法是锁定一个感兴趣的元素,我将其作为Chart
元素,其属性ce
的值为'p',然后将其用作参考框架。此外,除非Xml已经过验证(例如与XSD相比),否则不要假设元素存在或有效,因此请检查空值,无效数据类型等。
XmlDocument
:
var doc = new XmlDocument();
doc.LoadXml(xmlFileName);
int firstValue, secondValue;
var interestingChartNode = doc.SelectSingleNode("//Chart[@ce='p']");
if (interestingChartNode != null)
{
firstValue = Convert.ToInt32(interestingChartNode
.SelectSingleNode("GroupingSection[1]/@count").Value);
secondValue = Convert.ToInt32(interestingChartNode
.SelectSingleNode("GroupingSection[2]/@count").Value);
}
另外,Linq到Xml
(就我个人而言,我仍会跳过所有被忽略的XPath节点,但其他人可能不同意):
var xdoc = XDocument.Parse(xmlFileName); // using System.Xml.Linq;
var interestingGroupingSections = xdoc
.XPathSelectElements("//Chart[@ce='p']/GroupingSection"); // using System.Xml.XPath;
if (interestingGroupingSections.Any())
{
firstValue = Convert.ToInt32(interestingGroupingSections.First()
.Attributes("count")
.First().Value);
secondValue = Convert.ToInt32(interestingGroupingSections.Skip(1)
.Attributes("count")
.First().Value);
}