XPath:从子节点获取父节点

我需要为子节点title 50获取父节点

目前我只使用

//*[title="50"]

我如何得到它的父? 结果应该是store节点


<?xml version="1.0" encoding="utf-8"?>
<d:data xmlns:d="defiant-namespace" d:mi="23">
<store d:mi="22">
<book price="12.99" d:price="Number" d:mi="4">
<title d:constr="String" d:mi="1">Sword of Honour</title>
<category d:constr="String" d:mi="2">fiction</category>
<author d:constr="String" d:mi="3">Evelyn Waugh</author>
</book>
<book price="8.99" d:price="Number" d:mi="9">
<title d:constr="String" d:mi="5">Moby Dick</title>
<category d:constr="String" d:mi="6">fiction</category>
<author d:constr="String" d:mi="7">Herman Melville</author>
<isbn d:constr="String" d:mi="8">0-553-21311-3</isbn>
</book>
<book price="8.95" d:price="Number" d:mi="13">
<title d:constr="String" d:mi="10">50</title>
<category d:constr="String" d:mi="11">reference</category>
<author d:constr="String" d:mi="12">Nigel Rees</author>
</book>
<book price="22.99" d:price="Number" d:mi="18">
<title d:constr="String" d:mi="14">The Lord of the Rings</title>
<category d:constr="String" d:mi="15">fiction</category>
<author d:constr="String" d:mi="16">J. R. R. Tolkien</author>
<isbn d:constr="String" d:mi="17">0-395-19395-8</isbn>
</book>
<bicycle price="19.95" d:price="Number" d:mi="21">
<brand d:constr="String" d:mi="19">Cannondale</brand>
<color d:constr="String" d:mi="20">red</color>
</bicycle>
</store>
</d:data>
509107 次浏览

使用带有父节点名称的parent

//*[title="50"]/parent::store

如果父节点是store,那么XPath只会选择父节点。

但你也可以用其中一个

//*[title="50"]/parent::*
//*[title="50"]/..

这些路径将选择任何父节点。因此,如果文档发生更改,您将始终选择一个节点,即使它不是您期望的节点。

编辑

在给定的例子中,父节点是一辆自行车,而父节点的父节点是一家商店,会发生什么?

它上升了吗?

不,它只会在匹配//*[title="50"]的节点的父节点时选择存储。

如果没有,是否有方法在这种情况下上升,如果没有这样的父节点返回None ?

是的,你可以使用ancestor

//*[title="50"]/ancestor::store

这将选择匹配//*[title="50"]的所有“stores”节点的所有祖先。如。

<data xmlns:d="defiant-namespace" d:mi="23">
<store mi="1">
<store mi="22">
<book price="8.95" d:price="Number" d:mi="13">
<title d:constr="String" d:mi="10">50</title>
<category d:constr="String" d:mi="11">reference</category>
<author d:constr="String" d:mi="12">Nigel Rees</author>
</book>
</store>
</store>
</data>

XPath选择结果

作为一种替代方法,你可以使用ancestor

//*[title="50"]/ancestor::store

它比parent更强大,因为它甚至可以获取祖父或曾祖父

你也可以在表达式末尾使用两个点。请看这个例子:

//*[title="50"]/..

一个老问题的新改进答案

我怎样才能得到它的父结点呢?结果应该是store节点。

使用谓词,而不是parent::ancestor::

这里的大多数答案选择title,然后遍历到目标父元素或祖先元素(store)。一种更简单、直接的方法是首先直接选择父元素或祖先元素,从而避免遍历parent::ancestor::轴:

//*[book/title = "50"]

如果介入的元素名称不同:

//*[*/title = "50"]

或者,在名称和深度上:

//*[.//title = "50"]