在XML文档中查找重复的子节点

时间:2016-07-22 11:10:42

标签: c# xml linq linq-to-xml

我有以下XML文档

<xml>
    <schedule orderno = "1">
           <item orderno = "1" />
           <item orderno = "2" />
           <item orderno = "3" />
           <item orderno = "2" />
    </schedule>
    <scool orderno = "2">
           <item orderno = "5" />
           <item orderno = "6" />
           <item orderno = "1" />
           <item orderno = "4" />
    </scool>
</xml>

我在xml文件中有不一致的数据,需要一个xpath表达式来获取副本。

规则是每个节点@ordnerno中来自item的属性scool/schedule必须具有唯一值。如果我在12 3 2 schedule @orderno且值2重复且不一致。

我使用XML linq表达式库

XDocument.Parse(structure)
         .Descendants("item")
         .Attributes("orderno")
         .GroupBy(g => g.Value)
         .Where(g => g.Count() > 1)

我的解决方案不是最理想的,因为它将所有节点schedulescool分组。

输出为12,但在这种情况下,1不是预期的。

如何解决我的问题?

1 个答案:

答案 0 :(得分:6)

也可以逐项尝试,如下所示:

XDocument.Parse(xml)
         .Descendants("item")
         .GroupBy(x => new { x.Parent.Name, orderno = x.Attribute("orderno").Value } )
         .Where(g => g.Count() > 1);

更新以在任何嵌套级别选择重复@orderno的节点:

XDocument.Parse(xml)
         .Root
         .XPathSelectElements("//*[@orderno]")
         .Cast<XElement>()
         .GroupBy(x => new { x.Parent, orderno = x.Attribute("orderno").Value })
         .Where(g => g.Count() > 1)
         .Dump();