我需要获取子节点的父节点"标题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>
答案 0 :(得分:217)
将parent
axes与父节点的名称一起使用。
//*[title="50"]/parent::store
如果父节点是store
,则此XPath将仅选择父节点。
但你也可以使用其中一种
//*[title="50"]/parent::*
//*[title="50"]/..
这些xpath将选择任何父节点。因此,如果文档发生更改,您将始终选择一个节点,即使它不是您期望的节点。
修改强>
在父亲是自行车而父母的父母是商店的给定示例中会发生什么?
它上升了吗?
不,它只选择商店,如果它是与//*[title="50"]
匹配的节点的父节点。
如果没有,是否有方法在这种情况下上升,如果没有这样的父母,则返回None?
是的,您可以使用ancestor
轴
//*[title="50"]/ancestor::store
这将选择与//*[title="50"]
匹配的store
节点的所有祖先。 E.g。
<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>
答案 1 :(得分:22)
作为替代方案,您可以使用ancestor
。
//*[title="50"]/ancestor::store
它比parent
更强大,因为它甚至可以让祖父母或伟大的祖父母
答案 2 :(得分:7)
您也可以在表达式的末尾使用两个点。参见以下示例:
//*[title="50"]/..
答案 3 :(得分:1)
新的,经过改进的答案,可以解决旧的常见问题...
我如何获得其父母?结果应为
store
节点。
parent::
或ancestor::
轴此处大多数答案都选择title
,然后遍历到目标store
元素。一种更简单,直接的方法是首先直接选择store
元素,而不必遍历到parent::
或ancestor::
:
//store[book/title = "50"]
中间元素的名称是否应改变
//store[*/title = "50"]
或者,在名称和深度上:
//store[.//title = "50"]
答案 4 :(得分:0)
这适用于我的情况。我希望你能从中汲取意义。
//div[text()='building1' and @class='wrap']/ancestor::tr/td/div/div[@class='x-grid-row-checker']