使用XPath识别XML中的重复节点

4

我正在尝试识别以下XML结构中的重复组节点。我需要找到树中所有具有相同名称的组。

<report>
    <group name="a">
        <group name="1"></group>
        <group name="2"></group>
    </group>
    <group name="b">
        <group name="1"></group>
    </group>
</report>

类似于这个帖子 (如何使用XPathNavigator评估在XPath 1.0中识别重复节点?) 然而,我需要识别具有相同属性的组,而不是相同的节点值。

2个回答

5

使用Linq To xml查找重复项如何?

var dubs = XDocument.Parse(xml)
            .Descendants("group")
            .GroupBy(g => (string)g.Attribute("name"))
            .Where(g => g.Count() > 1)
            .Select(g => g.Key);

1
这是一些奇怪的XPath :-) OP不是专门要求XPath吗? - Jens Kloster
3
@JensKloster 那又怎样?向 OP 和其他 S.O 用户展示其他选择难道不好吗?难道不可能是因为 OP 使用的示例中使用了 XPath,所以他才要求 XPath 呢?也许他也愿意使用 Linq。 - I4V
我看到你的回答后,并没有给你的回答点踩,其实我也更喜欢使用 Linq :-) 当我看到你的回答时,我想你甚至没有认真阅读问题,因为你只是发了一段代码块。 - Jens Kloster

5

你的问题的解决方案与你链接的答案非常相似,但你需要处理一个属性而不是子元素,并且想要搜索所有后续和同级节点,而不仅限于同级节点。


查找所有具有名称的组,这些名称在之后再次出现,但在之前没有出现。

//group[@name = following::group/@name and not(@name = preceding::group/@name)]

如果想要查找所有出现的情况,则应该双向搜索:
//group[@name = following::group/@name or @name = preceding::group/@name]

这个对我不起作用,所以我采用了下面的解决方案。谢谢你的帮助。 - user2367250
1
您提供的输入是否与您使用的完全相同?通常这是由于命名空间的问题,阻止了像这样简单查询的运行。 - Jens Erat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接