XPATH表达式选择有两个孩子的父母

时间:2011-03-16 03:12:21

标签: xml xpath

我有一个与此类似的XML结构:

<Header>
    <ElementA>
        <ElementB>
            <ElementC/>
            <ElementC/>
        </ElementB>
        <ElementB/>
    </ElementA>
</Header>

其中<ElementB>的序列可能为<ElementC>,或者可能没有。{/ p>

我可以选择<ElementA><ElementB>/Header/ElementA/ElementB/following-sibling::ElementB<ElementA>个节点。我可以使用<ElementB>选择包含<ElementC>节点的/Header/ElementA/ElementB[ElementC]个节点,其中包含<ElementA>

但是,如何选择包含<ElementB>的{​​{1}}个节点,其中包含<ElementC>后跟另一个<ElementB>包含另一个<ElementC>的节点。像这样:

<Header>
    <ElementA>
        <ElementB>
            <ElementC/>
            <ElementC/>
        </ElementB>
        <ElementB>
            <ElementC/>
            <ElementC/>
        </ElementB>
    </ElementA>
</Header>

3 个答案:

答案 0 :(得分:9)

请注意,您不必显式搜索以下兄弟轴。这两种模式将返回相同的结果:

foo[bar/following-sibling::bar]

foo[bar[2]]

所以你的模式可以简单:

/Header/ElementA[ElementB[ElementC][2]]

会找到ElementA个包含两个或更多ElementB个孩子的元素,每个孩子都有一个ElementC孩子。

答案 1 :(得分:3)

我可能刚刚回答了我自己的问题:

/Header/ElementA[ElementB[ElementC]/following-sibling::ElementB[ElementC]]

似乎有效。它之前似乎不起作用的原因是我的文件,所有88,000行,没有出现这种模式。这可能表示产生它的代码中存在错误,而不是我的XPATH表达式中的错误。

答案 2 :(得分:2)

嵌套谓词可以完成工作:

/Header/ElementA[ElementB[following-sibling::ElementB/ElementC]/ElementC]