XPath可以只返回具有X子节点的节点吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XPath可以只返回具有X子节点的节点吗?相关的知识,希望对你有一定的参考价值。

是否可以使用XPath仅选择具有特定子元素的节点?例如,从这个XML我只想要宠物中有'bar'子元素的元素。因此,结果数据集将包含此示例中的lizardpig元素:

<pets>
  <cat>
    <foo>don't care about this</foo>
  </cat>
  <dog>
   <foo>not this one either</foo>
  </dog>
  <lizard>
   <bar>lizard should be returned, because it has a child of bar</bar>
  </lizard>
  <pig>
   <bar>return pig, too</bar>
  </pig>
</pets>

这个Xpath给了我所有的宠物:"/pets/*",但我只想要有一个名为'bar'的子节点的宠物。

答案

这就是它的荣耀

/pets/*[bar]

英语:给我所有有孩子petsbar的孩子

另一答案
/pets/child::*[child::bar]

我的原谅,我没有看到对上一个答复的评论。

但在这种情况下,我宁愿使用descendant::轴,它包括指定的所有元素:

/pets[descendant::bar]
另一答案

万一你想要更具体地了解孩子 - 你也可以在他们身上使用选择器。

例:

<pets>
    <cat>
        <foo>don't care about this</foo>
    </cat>
    <dog>
        <foo>not this one either</foo>
    </dog>
    <lizard>
        <bar att="baz">lizard should be returned, because it has a child of bar</bar>
    </lizard>
    <pig>
        <bar>don't return pig - it has no att=bar </bar>
    </pig>
</pets>

现在,你只关心所有pets有任何孩子bar有一个属性attbaz。您可以使用以下xpath表达式:

//pets/*[descendant::bar[@att='baz']]

结果

<lizard>
    <bar att="baz">lizard should be returned, because it has a child of bar</bar>
</lizard>

以上是关于XPath可以只返回具有X子节点的节点吗?的主要内容,如果未能解决你的问题,请参考以下文章

xPath:只能选择具有一定数量的特定子节点的节点吗?

根据XPath中子节点的double值查找父节点

使用 xpath 访问具有命名空间的子节点

xpath按元素和属性查找节点,其中包含具有特定id的子元素

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

如何使用 XPath 忽略命名空间