在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)
我的解决方案是次优的,因为它将所有节点(schedule
和scool
)分组。
输出是1
和2
,但在这种情况下不期望1
。
我该如何解决我的问题?
也尝试按项目的父级分组,类似于以下内容:
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();