文章

XPath基础

开始

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的节点

本文由作者按照 CC BY 4.0 进行授权