【问题标题】:How to find a duplicate attribute value in xml using XPATH如何使用 XPATH 在 xml 中查找重复的属性值
【发布时间】:2017-01-01 15:19:05
【问题描述】:

我有以下 XML:

<RootNode>
    <innerNode name="x1"/>
    <innerNode name="x2"/>
    <innerNode name="x1"/>
    <innerNode name="x3"/>
</RootNode>

我怎样才能找到,使用 XPATH,并且不迭代结果,innerNode 具有重复的名称? (在上面的例子中,x1 是重复的)。

【问题讨论】:

  • 您确实需要指定 XPath 1.0 或 XPath 2.0。

标签: xml c#-4.0 xpath


【解决方案1】:

以下 XPath 将返回 innerNode 元素,其中 name 属性在同级 innerNode 元素中有重复:

//innerNode[
    @name = following-sibling::innerNode/@name
        or
    @name = preceding-sibling::innerNode/@name
]

demo

【讨论】:

    【解决方案2】:

    作为更全面的解决方案,改编自answer from a similar question

    //innerNode[
        @name = following::innerNode/@name
           or 
        @name = preceding::innerNode/@name
    ]
    

    即使在嵌套innerNode 元素的情况下,也会发现重复项,如下所示:

    <RootNode>
        <innerNode name="x1">
            <innerNode name="x1" />
            <innerNode name="x2" />
        </innerNode>
        <innerNode name="x2">
            <innerNode name="x3" />
        </innerNode>
    </RootNode>
    

    编辑: 作为进一步的概括,在innerNodes 中找到name 属性anywhere

    //innerNode[
        descendant-or-self::*/@name = following::innerNode/descendant-or-self::*/@name
            or 
        descendant-or-self::*/@name = preceding::innerNode/descendant-or-self::*/@name
    ]
    

    这将发现第一个innerNodechildNode 中的name 属性与最后一个(即第三个)innerNode 本身的name 属性相同:

    <RootNode>
        <innerNode>
            <childNode name="x1" />
        </innerNode>
        <innerNode>
            <childNode name="x2" />
        </innerNode>
        <innerNode name="x1"/>
    </RootNode>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-17
      • 1970-01-01
      • 1970-01-01
      • 2021-05-22
      • 2012-07-22
      • 2018-08-10
      相关资源
      最近更新 更多