XPath通过路径表达式来定位XML文档中的节点,能够快速筛选出需要的内容,是XML解析过程中非常实用的工具。它支持从根节点、任意节点出发查找目标,也可以根据节点的属性、文本内容设置筛选条件,适配不同的XML处理需求。

XPath基础概念
XPath将XML文档视为一个节点树,每个元素、属性、文本内容都属于树中的一个节点。常见的节点类型包括元素节点、属性节点、文本节点,不同类型的节点在XPath表达式中对应不同的定位方式。
常用节点定位符号
- /:从根节点开始定位,表示绝对路径
- //:从任意位置开始定位,匹配文档中所有符合规则的节点
- .:表示当前节点
- ..:表示当前节点的父节点
- @:用于选取属性节点
XPath路径表达式示例
下面通过一个简单的XML文档来演示XPath的具体用法,首先给出示例XML内容:
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book category="编程">
<title lang="zh">Python基础教程</title>
<author>张三</author>
<price>59.9</price>
</book>
<book category="文学">
<title lang="zh">散文精选</title>
<author>李四</author>
<price>39.9</price>
</book>
</bookstore>
基础路径表达式应用
以下是一些常见的XPath表达式及其匹配结果:
| XPath表达式 | 匹配结果 |
|---|---|
| /bookstore/book | 匹配bookstore根节点下的所有book子节点 |
| //title | 匹配文档中所有的title节点 |
| /bookstore/book[1] | 匹配bookstore下的第一个book节点 |
| //book[@category="编程"] | 匹配所有category属性为编程的book节点 |
| //title[@lang="zh"]/text() | 匹配所有lang属性为zh的title节点的文本内容 |
实际提取XML数据示例
使用Python的lxml库可以很方便地通过XPath提取XML中的数据,以下是完整的实现代码:
from lxml import etree
# 示例XML字符串
xml_str = """<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book category="编程">
<title lang="zh">Python基础教程</title>
<author>张三</author>
<price>59.9</price>
</book>
<book category="文学">
<title lang="zh">散文精选</title>
<author>李四</author>
<price>39.9</price>
</book>
</bookstore>"""
# 解析XML
tree = etree.XML(xml_str)
# 提取所有书籍的名称
titles = tree.xpath("//title/text()")
print("所有书籍名称:", titles)
# 提取编程类书籍的作者
programming_authors = tree.xpath("//book[@category='编程']/author/text()")
print("编程类书籍作者:", programming_authors)
# 提取价格大于50的书籍名称
expensive_books = tree.xpath("//book[price>50]/title/text()")
print("价格大于50的书籍:", expensive_books)
注意事项
在使用XPath处理XML时,需要注意XML文档的命名空间问题,如果XML带有命名空间,需要在XPath表达式中声明对应的命名空间前缀才能正确匹配节点。另外,XPath的索引是从1开始的,和很多编程语言中从0开始的索引规则不同,编写表达式时要注意避免索引错误。
XPath除了可以应用在XML文档处理中,也常被用于HTML文档的解析,核心的定位逻辑和XML场景是一致的,掌握XPath在XML中的应用后,也可以快速迁移到HTML解析场景中。