Xpath语法基础知识
Author:Once Day Date:2023年3月30日
参考文档:
- XPath 语法 | 菜鸟教程 (runoob.com)
- xpath cover page - W3C
- 爬虫解析库:XPath - 简书 (jianshu.com)
- XML Path Language (XPath) 3.1 (w3.org)
- 一文搞懂 XPath 定位 - 知乎 (zhihu.com)
1.概述
下面是关于xpath的概述:
- XPath 使用路径表达式在 XML 文档中进行导航
- XPath 包含一个标准函数库
- XPath 是 XSLT 中的主要元素
- XPath 是一个 W3C 标准
XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。
XPath 含有超过 100 个内建的函数。这些函数用于字符串值、数值、日期和时间比较、节点和 QName 处理、序列处理、逻辑值等等。
关于这些函数,可参考网站文章:XPath、XQuery 以及 XSLT 函数 | 菜鸟教程 (runoob.com)
1.1 Xpath节点术语
在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点。
基本值是指无父或无子的节点,项目则指基本值或者节点。
节点之间有如下的可能关系:
- 父(Parent), 每个元素以及属性都有一个父。
- 子(Children), 元素节点可有零个、一个或多个子。
- 同胞(Sibling),拥有相同的父的节点。
- 先辈(Ancestor),某节点的父、父的父,等等。
- 后代(Descendant),某个节点的子,子的子,等等。
2. 基础语法
2.1 选取节点
下面是常见的XPATH路径表达式:
表达式 | 描述 |
---|---|
node-name | 选取此节点的所有子节点。如testnode ,选取testnode元素的所有子节点。 |
/ | 从根节点开始选取,即绝对路径,如/test1/test2 ,选取从根元素test1下test2的所有子节点。 |
// | 从匹配选择的当前节点选择文档中的节点,忽略节点位置,如//test ,选取所有test元素,忽略它们所在位置。 |
. | 选取当前节点位置,即相对路径。 |
… | 选取当前节点的父节点,即相对路径。 |
@name | 选取名字为name的属性。 |
上述的不同路径表达式能互相组合,从而构建强大的表达能力。
2.2 谓语表达式
谓语用来查找某个特定的节点或者包含某个指定的值的节点,被嵌在方括号中使用。
下面是一些实际的谓语表达式例子,来自XPath 语法 | 菜鸟教程 (runoob.com):
路径表达式 | 结果 |
---|---|
/test1/book[1] | 选取属于 bookstore 子元素的第一个 book 元素。 |
/bookstore/book[last()] | 选取属于 bookstore 子元素的最后一个 book 元素。 |
/bookstore/book[last()-1] | 选取属于 bookstore 子元素的倒数第二个 book 元素。 |
/bookstore/book[position()< 3] | 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。 |
//title[@lang] | 选取所有拥有名为 lang 的属性的 title 元素。 |
//title[@lang=‘eng’] | 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。 |
/bookstore/book[price>35.00] | 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。 |
/bookstore/book[price>35.00]//title | 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。 |
2.3 选取未知节点
XPath 通配符可用来选取未知的 XML 元素。
通配符 | 描述 |
---|---|
* | 匹配任何元素节点, 如/ip/* ,选取IP节点下面的所有节点。 |
@* | 匹配任何属性节点,如//network[@*] ,选取所有带属性的title元素。 |
node() | 匹配任何类型的节点。 |
2.4 多路径选择
在路径表达式中使用|
运算符,可以选取多个路径。如下:
//test1 | //test2
选取文档中所有test1
和test2
元素。
2.5 Xpath轴
通过轴这一定义,能以当前节点的相对位置选择目标节点集。
轴名称 | 结果 |
---|---|
ancestor | 选取当前节点的所有先辈(父、祖父等)。 |
ancestor-or-self | 选取当前节点的所有先辈(父、祖父等)以及当前节点本身。 |
attribute | 选取当前节点的所有属性。 |
child | 选取当前节点的所有子元素。 |
descendant | 选取当前节点的所有后代元素(子、孙等)。 |
descendant-or-self | 选取当前节点的所有后代元素(子、孙等)以及当前节点本身。 |
following | 选取文档中当前节点的结束标签之后的所有节点。 |
following-sibling | 选取当前节点之后的所有兄弟节点 |
namespace | 选取当前节点的所有命名空间节点。 |
parent | 选取当前节点的父节点。 |
preceding | 选取文档中当前节点的开始标签之前的所有节点。 |
preceding-sibling | 选取当前节点之前的所有同级节点。 |
self | 选取当前节点。 |
使用如下:
//test/following::*[2]
//test/ancestor::*
第一个表达式选取了当前节点之后顺数第二个节点。
第二个表达式选取了当前节点的所有祖先节点。
2.6 XPath运算符
这些元素符含义很直接,来源于:XPath 运算符 | 菜鸟教程 (runoob.com)
运算符 | 描述 | 实例 | 返回值 |
---|---|---|---|
| | 计算两个节点集 | //book | //cd | 返回所有拥有 book 和 cd 元素的节点集 |
+ | 加法 | 6 + 4 | 10 |
- | 减法 | 6 - 4 | 2 |
* | 乘法 | 6 * 4 | 24 |
div | 除法 | 8 div 4 | 2 |
= | 等于 | price=9.80 | 如果 price 是 9.80,则返回 true。如果 price 是 9.90,则返回 false。 |
!= | 不等于 | price!=9.80 | 如果 price 是 9.90,则返回 true。如果 price 是 9.80,则返回 false。 |
< | 小于 | price<9.80 | 如果 price 是 9.00,则返回 true。如果 price 是 9.90,则返回 false。 |
<= | 小于或等于 | price<=9.80 | 如果 price 是 9.00,则返回 true。如果 price 是 9.90,则返回 false。 |
> | 大于 | price>9.80 | 如果 price 是 9.90,则返回 true。如果 price 是 9.80,则返回 false。 |
>= | 大于或等于 | price>=9.80 | 如果 price 是 9.90,则返回 true。如果 price 是 9.70,则返回 false。 |
or | 或 | price=9.80 or price=9.70 | 如果 price 是 9.80,则返回 true。如果 price 是 9.50,则返回 false。 |
and | 与 | price>9.00 and price<9.90 | 如果 price 是 9.80,则返回 true。如果 price 是 8.50,则返回 false。 |
mod | 计算除法的余数 | 5 mod 2 | 1 |
3.内建函数
详细内容可以参考:XPath、XQuery 以及 XSLT 函数 | 菜鸟教程 (runoob.com)
其他可参考资料: