maiaimei
XPath(XML Path Language)是一种用于在XML文档中定位节点的查询语言。它使用类似文件系统路径的语法来导航XML文档的层次结构。
# XPath基本概念
XPath将XML文档视为节点树,包括:
- 元素节点
- 属性节点
- 文本节点
- 命名空间节点
- 处理指令节点
- 注释节点
# XPath语法
# 路径表达式
绝对路径(从根节点开始):
/html/body/div
1
相对路径(从当前节点开始):
div/p
1
任意位置:
//div # 文档中所有div元素
//div/p # 所有div下的直接p子元素
1
2
2
# 节点选择
nodename # 选择所有名为nodename的子节点
/ # 从根节点选择
// # 从匹配选择的当前节点选择文档中的节点,不考虑位置
. # 选择当前节点
.. # 选择当前节点的父节点
@ # 选择属性
1
2
3
4
5
6
2
3
4
5
6
# 谓语(Predicates)
使用方括号[]来筛选节点:
/bookstore/book[1] # 第一个book元素
/bookstore/book[last()] # 最后一个book元素
/bookstore/book[position()<3] # 前两个book元素
//book[@lang] # 所有有lang属性的book元素
//book[@lang='en'] # lang属性为'en'的book元素
//book[price>35.00] # price大于35的book元素
1
2
3
4
5
6
2
3
4
5
6
XPath下标从 1 开始,不是从0开始。
//book[1] # 第一个book元素
//book[2] # 第二个book元素
//book[3] # 第三个book元素
1
2
3
2
3
这与大多数编程语言的数组索引(从0开始)不同。XPath使用基于1的索引系统。
相关函数也遵循这个规则:
position() # 返回当前节点的位置,从1开始
last() # 返回最后一个节点的位置
1
2
2
# 通配符
* # 匹配任何元素节点
@* # 匹配任何属性节点
node() # 匹配任何类型的节点
1
2
3
2
3
# 轴(Axes)
child:: # 选择当前节点的所有子元素
parent:: # 选择当前节点的父节点
ancestor:: # 选择当前节点的所有先辈
descendant:: # 选择当前节点的所有后代
following:: # 选择文档中当前节点结束标签之后的所有节点
preceding:: # 选择文档中当前节点开始标签之前的所有节点
1
2
3
4
5
6
2
3
4
5
6
# 运算符
| # 计算两个节点集
+ # 加法
- # 减法
* # 乘法
div # 除法
= # 等于
!= # 不等于
< # 小于
<= # 小于或等于
> # 大于
>= # 大于或等于
and # 逻辑与
or # 逻辑或
mod # 计算除法的余数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 常用函数
text() # 获取元素的文本内容
contains() # 包含指定字符串
starts-with() # 以指定字符串开头
normalize-space() # 去除前后空格
count() # 计算节点数量
position() # 返回节点位置
last() # 返回最后一个节点
1
2
3
4
5
6
7
2
3
4
5
6
7
# 实际示例
# 选择所有书籍
//book
# 选择第一本书的标题
//book[1]/title
# 选择价格大于35的所有书籍
//book[price>35]
# 选择包含"Java"的标题
//title[contains(text(),'Java')]
# 选择所有有lang属性的book元素的title
//book[@lang]/title
# 选择最后一个book元素的所有子节点
//book[last()]/*
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
XPath广泛应用于XML解析、网页抓取、自动化测试等场景中。