我有以下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
必须具有唯一值。如果我在1
中2
3
2
schedule
@orderno
且值2
重复且不一致。
我使用XML linq表达式库
XDocument.Parse(structure)
.Descendants("item")
.Attributes("orderno")
.GroupBy(g => g.Value)
.Where(g => g.Count() > 1)
我的解决方案不是最理想的,因为它将所有节点schedule
和scool
分组。
输出为1
和2
,但在这种情况下,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();