xpath选择父节点类型不同的子节点

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了xpath选择父节点类型不同的子节点相关的知识,希望对你有一定的参考价值。

我为可能误导性的标题道歉,我不知道该怎么说。

我有一个巨大的xml文件,里面有很多元素,我需要得到一个特定元素(名称为w:r),但前提是该元素不在另一个名为w:r的元素中

e.f.:

<w:r>
    test
</w:r>

应该选择一个元素

<w:r>
    <w:r>
        test
    </w:r>
</w:r>

还应该只选择一个元素(外部元素)而不是两个元素。

我目前的解决方案是://*[local-name()='r'],但它为第二个例子选择了两个元素(一个是外部元素,另一个是内部元素)

答案

您可以使用以下XPath表达式提取外部w:r元素:

//*[local-name()='r' and not(parent::*[local-name()='r'])]

对于以下XML(用于测试目的):

<?xml version='1.0' encoding='utf-8'?>
<root xmlns:w="xxx">
    <w:r t="c">
        test
    </w:r>  
    <w:r t="d">
        <w:r t="h">
            test
        </w:r>
    </w:r>
    <w:r t="e">
        <a>
            <b>
                <c>...
                    <w:r t="i">Something</w:r>
                    ...
                </c>
            </b>
        </a>
    </w:r>
</root>

输出是:

<w:r xmlns:w="xxx" t="c"/>  
<w:r xmlns:w="xxx" t="d"/>
<w:r xmlns:w="xxx" t="e"/>

这意味着表达式选择了所有外部w:r元素。


如果您想考虑所有父母而不仅仅是直接父母,您可以像这样使用ancestor::轴:

//*[local-name()='r' and not(ancestor::*[local-name()='r'])]

对于示例XML,结果是相同的,但语义是不同的。

以上是关于xpath选择父节点类型不同的子节点的主要内容,如果未能解决你的问题,请参考以下文章

XPath如何选择具有相同值的子节点

在selenium2中,如何获取一个父节点下子节点的个数,所有的子节点的内容都有MOON

XPath语法

CSS/Xpath 选择器 第几个子节点/父节点/兄弟节点

Xpath

Xpath:如何结合这两个子节点得到父节点?