XPATH节点获取
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XPATH节点获取相关的知识,希望对你有一定的参考价值。
参考技术A xpath获取同级节点XPath轴(XPath Axes)可定义某个相对于当前节点的节点集:
1、child 选取当前节点的所有子元素
2、parent 选取当前节点的父节点
3、descendant 选取当前节点的所有后代元素(子、孙等)
4、ancestor 选取当前节点的所有先辈(父、祖父等)
5、descendant-or-self 选取当前节点的所有后代元素(子、孙等)以及当前节点本身
6、ancestor-or-self 选取当前节点的所有先辈(父、祖父等)以及当前节点本身
7、preceding-sibling 选取当前节点之前的所有同级节点
8、following-sibling 选取当前节点之后的所有同级节点
9、preceding 选取文档中当前节点的开始标签之前的所有节点
10、following 选取文档中当前节点的结束标签之后的所有节点
11、self 选取当前节点
12、attribute 选取当前节点的所有属性
13、namespace 选取当前节点的所有命名空间节点
如:要定位当前td同级后的一个td
//td[.='text']/following-sibling::td
XPath:从子节点获取父节点
【中文标题】XPath:从子节点获取父节点【英文标题】:XPath: Get parent node from child node 【发布时间】:2015-03-30 00:50:47 【问题描述】:我需要获取子节点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>
【问题讨论】:
【参考方案1】:使用带有父节点名称的parent
axes。
//*[title="50"]/parent::store
如果它是store
,这个XPath 只会选择父节点。
但你也可以使用其中之一
//*[title="50"]/parent::*
//*[title="50"]/..
这些 xpath 将选择任何父节点。因此,如果文档发生更改,您将始终选择一个节点,即使它不是您期望的节点。
编辑
在给定示例中,如果父项是自行车,但父项的父项是商店,会发生什么情况?
它会上升吗?
不,只有当它是匹配//*[title="50"]
的节点的父节点时才会选择商店。
如果没有,有没有一种方法可以在这种情况下上升,如果没有这样的父级,则返回 None?
是的,你可以使用ancestor
轴
//*[title="50"]/ancestor::store
这将选择与//*[title="50"]
匹配的节点的所有祖先,它们是` 存储。例如
<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>
【讨论】:
您也可以使用parent::*
缩写语法..
(例如://*[title="50"]/..
)或嵌套谓词(例如://*[*[title="50"]]
)
附加信息:w3.org/TR/xpath/#axes 和 w3.org/TR/xpath/#path-abbrev
或parent::node()
对应于快捷方式..
,在我看来更好。事实上parent::*
仅限于轴的主节点类型,在大多数情况下这不是问题。
如果你正在使用尝试.xpath('..')
或xpath('parent::node()')
"如果它是一个商店,这个 XPath 只会选择父节点。" - 在给定的例子中会发生什么,其中父母是bicycle
,但父母的父母是store
?它上升吗?如果没有,有没有一种方法可以在这种情况下上升并在没有这样的父级时返回None
?【参考方案2】:
您也可以使用ancestor
。
//*[title="50"]/ancestor::store
它比parent
更强大,因为它甚至可以得到祖父母或曾曾祖父母
【讨论】:
它不是“更强大”。只是不同而已。因此,轴的选择取决于用例。【参考方案3】:这适用于我的情况。我希望你能从中提取意义。
//div[text()='building1' and @class='wrap']/ancestor::tr/td/div/div[@class='x-grid-row-checker']
【讨论】:
我无法在正确的上下文中理解您的示例。【参考方案4】:您也可以使用表达式末尾的两个点。看这个例子:
//*[title="50"]/..
【讨论】:
【参考方案5】:对旧的常见问题的改进的新答案...
我怎样才能得到它的父母?结果应该是
store
节点。
使用谓词而不是 parent::
或 ancestor::
轴
这里的大多数答案选择title
,然后向上遍历到目标父或祖先(store
)元素。一种更简单直接的方法是首先直接选择父元素或祖先元素,无需遍历parent::
或ancestor::
轴:
//*[book/title = "50"]
如果中间元素名称不同:
//*[*/title = "50"]
或者,在名称和深度上:
//*[.//title = "50"]
【讨论】:
以上是关于XPATH节点获取的主要内容,如果未能解决你的问题,请参考以下文章
使用 DOMDocument PHP 获取 Xpath 父节点?