我希望获取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下的元素数量相匹配节点。
答案 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();
}