XPath 教程
XPath 教程
XPath(XML Path Language)是一门在 XML 文档中查找信息的语言,用于在文档树中导航和选取节点。它是 XSLT、XQuery、XPointer 的核心组件,也是 XML 数据处理的基础工具。
XPath 能做什么
- 从 XML 中选取任意节点(元素、属性、文本)
- 按条件过滤节点(谓词)
- 计算位置、判断、计数
- 被 XSLT、XQuery、Scrapy、Selenium 等大量工具使用
最小示例
<?xml version="1.0"?>
<bookstore>
<book>
<title>XML 入门</title>
<price>39.9</price>
</book>
</bookstore>
# XPath 表达式
/bookstore/book/title # 选取所有 title
//book # 选取所有 book 元素
//title[@lang] # 选取带 lang 属性的 title本教程将系统讲解 XPath 的节点、语法、轴与运算符。
XPath 简介
XPath 简介
XPath 是 W3C 定义的语言,在 XML 文档树中导航并选取节点,1999 年随 XSLT 1.0 发布,现已是 XML 生态的事实标准。
核心思想
把 XML 视为树,用"路径表达式"像文件路径一样定位节点:
/bookstore/book[1]/title # 第一个 book 的 title主要用途
- XSLT:模板匹配(
<xsl:template match="/bookstore">) - XQuery:数据查询
- 编程库:lxml、ElementTree、Selenium(Web 自动化)、Scrapy(爬虫)
- Schema 与文档验证
节点关系
XPath 基于父子、兄弟、祖先等树关系导航:
parent(父) child(子) sibling(兄弟)
ancestor(祖先) descendant(后代)版本
- XPath 1.0(1999):最普及,节点集模型
- XPath 2.0(2007):类型系统、更强的序列处理
- XPath 3.x:函数式增强,支持高阶函数
掌握 1.0 的核心语法即可应对绝大多数场景,后续版本向上兼容。
XPath 节点
XPath 节点
XPath 把 XML 文档视为节点树,理解节点类型是学习 XPath 的前提。
七种节点类型
| 类型 | 示例 |
|---|---|
| 根节点(文档节点) | /bookstore(最外层) |
| 元素节点 | <book> |
| 属性节点 | lang="en" |
| 文本节点 | XML 入门 |
| 命名空间节点 | xmlns:xlink="..." |
| 处理指令节点 | <?xml-stylesheet?> |
| 注释节点 | <!-- 注释 --> |
示例文档
<?xml version="1.0"?>
<bookstore>
<book lang="en">
<title>XML Developer's Guide</title>
<price>44.95</price>
</book>
</bookstore>节点关系
- 父(Parent):book 是 title/price 的父,bookstore 是 book 的父
- 子(Children):title、price 是 book 的子
- 同胞(Siblings):title 与 price 互为同胞
- 祖先(Ancestors):bookstore、book 是 title 的祖先
- 后代(Descendants):title、price 是 bookstore 的后代
基本选取
bookstore # 选取 bookstore 子元素(相对)
/bookstore # 绝对路径:根下 bookstore
//book # 文档中所有 book(任意深度)
bookstore//title # bookstore 后代中的 titleXPath 语法
XPath 语法
XPath 表达式由路径步骤组成,支持通配符、谓词与节点函数,掌握语法即可灵活选取任意节点。
基本表达式
nodename 选取此节点的所有子节点
/ 从根节点选取
// 从匹配选择的当前节点选择文档中的节点
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性示例
//title 所有 title
//title[@lang] 带 lang 属性的 title
//title[@lang='en'] lang 为 en 的 title
/bookstore/book[1] bookstore 下第一个 book
/bookstore/book[last()] 最后一个 book
/bookstore/book[position()<3] 前两个 book
//book[price>35] price 大于 35 的 book通配符
* 匹配任何元素节点
@* 匹配任何属性节点
node() 匹配任何类型的节点组合
//book/title | //book/price # 并集(多个路径)运算符
数值: + - * div mod
比较: = != < > <= >=
逻辑: and or not()
集合: | (并集)实例练习文档
<?xml version="1.0"?>
<bookstore>
<book category="WEB"><title lang="en">HTML</title><price>29.9</price></book>
<book category="AI"><title lang="zh">机器学习</title><price>59.0</price></book>
</bookstore>XPath 轴(Axes)
XPath 轴(Axes)
轴定义了节点集合相对于当前节点的方向,配合节点测试与谓词构成完整的定位步骤。
语法
轴名称::节点测试[谓词]
示例: child::book ancestor::bookstore常用轴
| 轴 | 含义 |
|---|---|
| child | 当前节点的所有子节点 |
| attribute | 当前节点的所有属性 |
| parent | 父节点(可简写为 ..) |
| ancestor | 所有祖先(父→根) |
| descendant | 所有后代 |
| following-sibling | 后面的同胞 |
| preceding-sibling | 前面的同胞 |
| self | 当前节点(可简写为 .) |
实例
child::book # 等价 //book
attribute::lang # 等价 @lang
descendant::title # 所有后代 title
ancestor::bookstore # 所有 bookstore 祖先
following-sibling::price # 后面的 price 同胞
parent::* # 父元素(等价 ..)位置路径示例
# 选取 title 为 "机器学习" 的 book 的所有祖先
//book[title='机器学习']/ancestor::*
# 选取 bookstore 下最后一个 book
/bookstore/book[position()=last()]建议
80% 的场景用子路径与 // 即可,轴主要用于复杂文档或 XSLT 模板中的精确定位。
XPath 运算符
XPath 运算符
XPath 提供算术、比较、逻辑与集合运算符,支持在表达式中进行计算与条件判断。
算术运算符
+ 加 //price + 5
- 减 //price - 5
* 乘 //price * 2
div 除 //price div 2
mod 取模 //price mod 3比较运算符
= 等于 //book[price=39.9]
!= 不等于 //book[price!=39.9]
< 小于 //book[price<50]
> 大于 //book[price>30]
<= 小于等于 //book[price<=40]
>= 大于等于 //book[price>=30]逻辑运算符
and 与 //book[price>30 and price<50]
or 或 //book[price>50 or price<20]
not() 非 //book[not(price)]集合运算符
| 并集 //book/title | //book/price实例
//book[price>30 and price<50]/title
//book[@category='WEB' or @category='AI']
//price[not(@discount)] # 无折扣价的 book注意
XML 中 < 需写为 < 转义(在 HTML 中显示时);XPath 1.0 中比较运算基于节点集或字符串/数字自动转换。
XPath 实例
XPath 实例
通过一个真实的图书数据文档,综合练习 XPath 的各种选取技巧。
示例文档(books.xml)
<?xml version="1.0"?>
<bookstore>
<book category="WEB">
<title lang="en">HTML 与 CSS</title>
<author>张三</author>
<year>2023</year>
<price>45.0</price>
</book>
<book category="PROGRAMMING">
<title lang="en">Python 编程</title>
<author>李四</author>
<year>2024</year>
<price>68.0</price>
</book>
<book category="AI">
<title lang="zh">机器学习入门</title>
<author>王五</author>
<year>2025</year>
<price>99.0</price>
</book>
</bookstore>查询练习与结果
//book # 3 个 book
/bookstore/book[1] # HTML 与 CSS
//title[@lang='zh'] # 机器学习入门
//book[price>50]/title # Python 编程、机器学习入门
//book[price>50]/author/text() # 李四 王五
count(//book) # 3
//book[last()] # 机器学习入门
//book[@category='WEB']/year # 2023
//book[position()<=2]/title # 前两个 title编程中使用(Python lxml)
from lxml import etree
tree = etree.parse("books.xml")
titles = tree.xpath("//book[price>50]/title/text()")
print(titles) # ['Python 编程', '机器学习入门']XPath 总结
XPath 总结
本教程系统讲解了 XPath 的节点模型、语法、轴与运算符,下面做整体回顾。
知识框架
- 节点:元素、属性、文本等七种类型,构成文档树
- 路径:绝对(/)、相对、// 后代、. 与 ..
- 谓词:[条件] 过滤节点,支持位置函数
- 轴:child、ancestor、sibling 等方向定位
- 运算符:算术、比较、逻辑、集合
最常用表达式速记
//element 所有某元素
//element[@attr] 带属性
//element[@attr='v'] 属性等于 v
//element[pos] 第 pos 个
//element[...] 谓词过滤
count() last() position() 常用函数实践建议
- 用 Python lxml / 在线 XPath 测试工具练习
- Selenium 定位 Web 元素也使用 XPath,技能可迁移
- 复杂需求从简单表达式逐步叠加
下一步
可继续学习 XQuery(XPath 的超集)或 XSLT(用 XPath 驱动模板转换),本知识体系将更加完整。
XPath、XQuery 以及 XSLT 函数
XPath、XQuery 以及 XSLT 函数
XPath 1.0 内置了一批常用函数,被 XPath、XQuery、XSLT 共享,是查询表达式的"工具箱"。
节点集函数
count(node-set) 计数
position() 位置
last() 最后位置
name() / local-name() 节点名称
namespace-uri() 命名空间 URI字符串函数
concat('a','b') 连接
substring(str,start,len) 截取
string-length(str) 长度
contains(str,sub) 包含判断
starts-with(str,sub) 前缀判断
normalize-space(str) 规范化空白
translate(str,from,to) 字符替换数值函数
number(obj) 转数字
floor(n) 向下取整
ceiling(n) 向上取整
round(n) 四舍五入
sum(node-set) 求和布尔函数
boolean(obj) 转布尔
not(bool) 取反
true() / false() 常量实例
//book[starts-with(title,'Py')]/title
//book[contains(author,'张')]
sum(//price) # 总价
substring(name(//book),1,4) # 取元素名前 4 字符
//book[position()=last()] # 最后一个XPath 2.0+ 扩展
新版本增加了大量函数:正则匹配(matches)、日期时间、序列操作(except/intersect)、字符串处理更丰富,以及 XQuery 的 FLWOR 表达式。
查阅完整函数库:https://www.w3.org/TR/xpath-functions/