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 后代中的 title

XPath 语法

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 中 < 需写为 &lt; 转义(在 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/

第 1 / 9 节