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

本文关键字:子节点 查找 XML 文档 | 更新日期: 2023-09-27 17:58:16

我有以下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表达式来获取重复数据。

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

我使用XML linq表达式库

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

我的解决方案是次优的,因为它将所有节点(schedulescool)分组。

输出是12,但在这种情况下不期望1

我该如何解决我的问题?

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

也尝试按项目的父级分组,类似于以下内容:

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