一、XPath 核心定义
XPath 是专门为在 XML 文档中快速定位、选取节点(元素 / 属性 / 文本)设计的查询语言,你可以把它理解成:
- XML 版的 "文件路径":像你在电脑里用
C:\文档\书籍\Python.pdf找到文件一样,XPath 用路径表达式定位 XML 中的某个节点 - XML 版的 "数据库查询语句(SQL)":能精准筛选出符合条件的节点(比如 "价格大于 100 的书籍")
它是解析 XML 的核心工具,几乎所有 XML 解析库(Python 的 lxml、Java 的 XPathAPI)都支持 XPath,比单纯遍历 XML 节点效率高得多
二、XPath 核心概念:节点类型
在 XPath 中,XML 的每一部分都是 "节点",核心节点类型:
| 节点类型 | 示例(对应之前的 books.xml) | 说明 |
|---|---|---|
| 元素节点 | <book>、<title>、<library> |
XML 的标签,是最核心的节点 |
| 属性节点 | id="1" |
元素的属性(带@标识) |
| 文本节点 | Python编程:从入门到实践 |
元素内的文本内容 |
| 根节点 | / |
代表整个 XML 文档的根(不是<library>,<library>是根元素) |
三、XPath 基础语法(核心路径表达式)
以之前的books.xml为例,先回顾文档结构:
xml
<?xml version="1.0" encoding="UTF-8"?>
<library> <!-- 根元素 -->
<book id="1">
<title>Python编程:从入门到实践</title>
<author>埃里克·马瑟斯</author>
<price>89.00</price>
</book>
<book id="2">
<title>Java核心技术</title>
<author>凯·霍斯特曼</author>
<price>129.00</price>
</book>
</library>
1. 基础路径(定位节点)
| 表达式 | 含义 | 示例(定位目标) |
|---|---|---|
/ |
从根节点开始(绝对路径) | /library → 定位根元素<library> |
// |
从任意位置匹配节点(相对路径) | //book → 定位所有<book>元素(不管层级) |
. |
当前节点 | //book/. → 等同于//book |
.. |
父节点 | //title/.. → 定位所有<title>的父节点(即<book>) |
@ |
选取属性 | //book/@id → 定位所有<book>的id属性 |
2. 筛选条件(谓语,用[])
可以给路径加条件,精准筛选节点:
| 表达式 | 含义 | 示例结果 |
|---|---|---|
//book[1] |
第一个<book> |
id=1 的 book |
//book[last()] |
最后一个<book> |
id=2 的 book |
//book[position()<2] |
位置小于 2 的 book | id=1 的 book |
//book[price>100] |
价格 > 100 的 book | id=2 的 book |
//book[@id='2'] |
id 属性为 2 的 book | id=2 的 book |
3. 通配符(匹配任意节点)
| 通配符 | 含义 | 示例 |
|---|---|---|
* |
任意元素节点 | /library/* → 定位<library>下所有子元素(即所有 book) |
@* |
任意属性节点 | //book/@* → 定位所有 book 的所有属性(即所有 id) |
node() |
任意类型节点 | //book/node() → 定位 book 下所有节点(title/author/price) |
4. 多路径匹配(用|)
可以同时选取多个路径的节点:
xpath
//title | //price # 定位所有<title>和<price>节点
四、实战示例(Python + lxml 解析 XML + XPath)
XPath 需要配合解析库使用,Python 中lxml库对 XPath 支持最好(需先安装):
安装依赖
bash
pip install lxml
完整代码
python
from lxml import etree
# 1. 加载XML文件(或字符串)
xml_str = """
<?xml version="1.0" encoding="UTF-8"?>
<library>
<book id="1">
<title>Python编程:从入门到实践</title>
<author>埃里克·马瑟斯</author>
<price>89.00</price>
</book>
<book id="2">
<title>Java核心技术</title>
<author>凯·霍斯特曼</author>
<price>129.00</price>
</book>
</library>
"""
# 解析XML
tree = etree.fromstring(xml_str)
# 2. 用XPath定位节点(核心操作)
# 示例1:获取所有book的id属性
book_ids = tree.xpath("//book/@id")
print("所有book的id:", book_ids) # 输出:['1', '2']
# 示例2:获取价格>100的book的标题
high_price_books = tree.xpath("//book[price>100]/title/text()")
print("价格>100的书籍标题:", high_price_books) # 输出:['Java核心技术']
# 示例3:获取第二个book的作者
second_book_author = tree.xpath("//book[2]/author/text()")
print("第二个book的作者:", second_book_author) # 输出:['凯·霍斯特曼']
# 示例4:获取所有title和price的文本
titles_and_prices = tree.xpath("//title/text() | //price/text()")
print("所有标题和价格:", titles_and_prices)
# 输出:['Python编程:从入门到实践', '89.00', 'Java核心技术', '129.00']
五、XPath 的使用场景
- XML 解析:快速提取 XML 中指定条件的数据(替代繁琐的遍历)
- 网页爬虫:XPath 是解析 HTML(HTML 本质是不严格的 XML)的核心工具,能精准定位网页中的元素(比如爬取商品标题、价格)
- 配置文件处理:快速修改 / 读取 XML 配置文件中的特定节点
总结
- XPath 是 XML 的路径查询语言,核心作用是快速定位 / 筛选 XML 中的元素、属性、文本节点,比手动遍历效率高
- XPath 的核心语法包括:
/(绝对路径)、//(任意路径)、@(属性)、[](条件筛选)、|(多路径) - 实际开发中,XPath 常配合解析库(如 Python 的 lxml)使用,是处理 XML/HTML 数据的必备技能