在c#中使用XmlDocument进行强大的解析xml

时间:2014-10-23 10:33:07

标签: c# xml parsing xmldocument

我有以下代码

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>

1 个答案:

答案 0 :(得分:1)

以下是使用XPath进行更强大解析的一些想法。这里的想法是锁定一个感兴趣的元素,我将其作为Chart元素,其属性ce的值为'p',然后将其用作参考框架。此外,除非Xml已经过验证(例如与XSD相比),否则不要假设元素存在或有效,因此请检查空值,无效数据类型等。

带有XPath版本的

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);
}