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

# 节点选择

nodename    # 选择所有名为nodename的子节点
/           # 从根节点选择
//          # 从匹配选择的当前节点选择文档中的节点,不考虑位置
.           # 选择当前节点
..          # 选择当前节点的父节点
@           # 选择属性
1
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

XPath下标从 1 开始,不是从0开始。

//book[1]     # 第一个book元素
//book[2]     # 第二个book元素
//book[3]     # 第三个book元素
1
2
3

这与大多数编程语言的数组索引(从0开始)不同。XPath使用基于1的索引系统。

相关函数也遵循这个规则:

position()   # 返回当前节点的位置,从1开始
last()       # 返回最后一个节点的位置
1
2

# 通配符

*           # 匹配任何元素节点
@*          # 匹配任何属性节点
node()      # 匹配任何类型的节点
1
2
3

# 轴(Axes)

child::         # 选择当前节点的所有子元素
parent::        # 选择当前节点的父节点
ancestor::      # 选择当前节点的所有先辈
descendant::    # 选择当前节点的所有后代
following::     # 选择文档中当前节点结束标签之后的所有节点
preceding::     # 选择文档中当前节点开始标签之前的所有节点
1
2
3
4
5
6

# 运算符

|           # 计算两个节点集
+           # 加法
-           # 减法
*           # 乘法
div         # 除法
=           # 等于
!=          # 不等于
<           # 小于
<=          # 小于或等于
>           # 大于
>=          # 大于或等于
and         # 逻辑与
or          # 逻辑或
mod         # 计算除法的余数
1
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

# 实际示例

# 选择所有书籍
//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

XPath广泛应用于XML解析、网页抓取、自动化测试等场景中。