开始
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()
-
获取节点属性:@attr
路径表达式组合:使用 |
组合两个路径表达式
节点过滤
在节点后加上 []
,可以在当前节点集中进行过滤,[]
中可以进行两类过滤
- 按指定位置过滤:选择指定位置的节点,从 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-price1
和 book2-price1
的节点