XPath轴中child、following与descendant的区别及descendant用法示例
嘿,我来帮你理清这三个XPath轴的区别,先纠正下你之前对::following轴的小误解,再详细讲::descendant,最后用一个简单的HTML例子对比三者~
三个XPath轴的定义与区别对比
1. 先明确::descendant轴的定义
::descendant轴会选中当前节点的所有后代节点——也就是直接子节点、子节点的子节点(孙节点)、更深层级的节点,直到叶子节点,简单说就是当前节点下面所有层级的子节点(不包括当前节点自己)。
2. 用示例对比三个轴
先给一个简单的HTML结构,我们以这个结构里的<div id="parent">作为当前节点来演示:
<div id="parent"> <p>直接子段落</p> <div id="child"> <span>孙节点span</span> <a href="#">孙节点链接</a> </div> <h2>另一个直接子标题</h2> </div> <p>父节点外的段落</p>
::child轴
- 定义:只选中当前节点的直接子节点(紧挨着当前节点的下一级节点,不会深入更下层)。
- XPath示例:
//div[@id='parent']::child::* - 选中的节点:
<p>直接子段落</p><div id="child">...</div><h2>另一个直接子标题</h2>
- 核心特点:只看一级子节点,范围最窄。
::descendant轴
- 定义:选中当前节点的所有后代节点(直接子节点、孙节点、曾孙节点等,所有层级的子节点都包含)。
- XPath示例:
//div[@id='parent']::descendant::* - 选中的节点:
<p>直接子段落</p><div id="child">...</div><span>孙节点span</span><a href="#">孙节点链接</a><h2>另一个直接子标题</h2>
- 核心特点:覆盖当前节点下的所有子层级,范围比
::child大很多。
::following轴(纠正你的理解)
你之前对这个轴的理解有点偏差哦——它不是用来选子节点的,而是:
- 定义:选中文档顺序中当前节点之后的所有非后代节点(也就是在当前节点的闭合标签
</div>之后出现的节点,完全不属于当前节点的后代树)。 - XPath示例:
//div[@id='parent']::following::* - 选中的节点:
<p>父节点外的段落</p>
- 核心特点:和当前节点的后代完全无关,只看文档流里当前节点结束之后的外部节点。
3. 快速对比总结
| 轴名称 | 选择范围 | 核心特点 |
|---|---|---|
::child | 当前节点的直接子节点(仅下一级) | 只看一级,范围最小 |
::descendant | 当前节点的所有后代节点(所有层级子节点) | 覆盖所有子层级,范围中等 |
::following | 文档顺序中当前节点之后的非后代节点 | 和后代无关,只看节点之后的外部节点 |
内容的提问来源于stack exchange,提问作者Pratiksha Jadhav
相关产品推荐
相关产品推荐

