获取XML节点下的xml元素数

时间:2015-04-07 00:06:50

标签: c# xml

我希望获取XML文件中特定节点下的元素数。

该文件类似于以下内容

<Return>
  <ReturnHeader>   
  </ReturnHeader>
  <ReturnData documentCnt="8">
    <file1></file1>   
    <file2></file2>   
    <file3></file3>   
    <file4></file4>   
    <file5></file5>   
    <file6></file6>   
    <file7></file7>   
    <file8></file8>
  </ReturnData>
<ParentReturn>
  <ReturnHeader> 
  </ReturnHeader>
  <ReturnData documentCnt="6">
    <file1></file1>   
    <file2></file2>   
    <file3></file3>   
    <file4></file4>   
    <file5></file5>   
    <file6></file6>     
  </ReturnData>
</ParentReturn>
<SubsidiaryReturn>
  <ReturnHeader>
  </ReturnHeader>
  <ReturnData documentCnt="3">
    <file1></file1>   
    <file2></file2>   
    <file3></file3>     
  </ReturnData>
</SubsidiaryReturn>
</Return>

我需要为ReturnData节点解析此xml文件(如您所见,它位于文件中的多个位置)并获取其下方元素的计数。

例如 - 在Return \ ReturnData下,计数必须为8 - 在Return \ ParentReturn \ ReturnData下,计数必须为6 - 在Return \ SubsidiaryReturn \ ReturnData下,计数必须为3

属性documentCnt实际上应该给我正确的计数,但是创建的xml文档会有差异,因此我需要解析这个xml文件并检查documentCnt属性中的值是否与ReturnData下的元素数量相匹配节点。

1 个答案:

答案 0 :(得分:1)

使用您提供的问题说明:

  

属性documentCnt实际上应该给我正确的计数但是   创建的xml文档会有差异,因此我   将需要解析此xml文件并检查中的值是否为   documentCnt属性匹配下的元素数量   ReturnData节点。

如果你在&#34; ReturnData&#34;上使用简单的select语句,这可以在一个步骤中解决。元素,如:

public static void Main(params string[] args)
{
    // test.xml contains OPs example xml.
    var xDoc = XDocument.Load(@"c:\temp\test.xml");

    // this will return an anonymous object for each "ReturnData" node.
    var counts = xDoc.Descendants("ReturnData").Select((e, ndx) => new
    {
        // although xml does not have specified order this will generally
        // work when tracing back to the source.
        Index = ndx,

        // the expected number of child nodes.
        ExpectedCount = e.Attribute("documentCnt") != null ? int.Parse(e.Attribute("documentCnt").Value) : 0,

        // the actual child nodes.
        ActualCount = e.DescendantNodes().Count()
    });

    // now we can select the mismatches
    var mismatches = counts.Where(c => c.ExpectedCount != c.ActualCount).ToList();

    // and the others must therefore be the matches.
    var matches = counts.Except(mismatches).ToList();

    // we expect 3 matches and 0 mismatches for the sample xml.
    Console.WriteLine("{0} matches, {1} mismatches", matches.Count, mismatches.Count);
    Console.ReadLine();
}