开始

XPath 是一门在 XML 文档中查找信息的语言,通常用于 HTML 文档的解析,使用路径表达式可以选择文档中的节点

路径选择

有两种路径选择方式

  • /:选择直接子节点
  • //:选择所有子孙节点

e.g. 对于下面的文档,选择其中的两个 price 节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="UTF-8"?>

<bookstore>
<title class="my-class">Hello</title>

<book>
<title lang="eng">Harry Potter</title>
<price>29.99</price>
</book>

<book>
<title lang="eng">Learning XML</title>
<price>39.95</price>
</book>

</bookstore>

两种方式的表达式分别如下

  • /bookstore/book/price
  • //price

获取节点内容的方式

  • 获取节点文本:text()

    1
    //title/text()
  • 获取节点属性:@attr

    1
    //title/@class

路径表达式组合:使用 | 组合两个路径表达式

1
//price | //title

节点过滤

在节点后加上 [],可以在当前节点集中进行过滤,[] 中可以进行两类过滤

  • 按指定位置过滤:选择指定位置的节点,从 1 开始
  • 按逻辑表达式过滤:选择满足条件的节点

选择指定位置的节点

1
2
3
//div[1]  # 选择第一个节点
//div[last()] # 选择最后一个节点
//div[position()=3] # 选择第三个节点

选择满足条件的节点

1
2
3
4
5
6
7
8
9
10
11
12
13
# 相等匹配(xpath支持比较匹配和运算,但使用较少,不再记录)
//div[text()='hello'] # 根据文本内容筛选
//div[@class='my-class'] # 根据属性值筛选

# 模糊匹配
//div[contains(text(), 'hello')] # 文本内容包含
//div[starts-with(text(), 'hello')] # 文本内容开头
//div[contains(@class, 'hello')] # 属性值包含
//div[starts-with(@class, 'hello')] # 属性值开头

# 逻辑组合
//div[text()='hello' and @class='my-class']
//div[text()='hello' or @class='my-class']

注意,节点过滤是针对单个层级路径下的节点集进行过滤,例如下面的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="UTF-8"?>

<bookstore>

<book>
<price id="book1-price1">29.99</price>
<price id="book1-price2">29.99</price>
</book>

<book>
<price id="book2-price1">39.95</price>
<price id="book2-price2">39.95</price>
</book>

</bookstore>

当使用 //price 时会选择全部四个 price 节点,此时筛选节点 //price[1],对每个层级路径都会进行一次过滤,即筛选后选择了 id 为 book1-price1book2-price1 的节点