XPath 是万维网联盟(W3C)制定的一种表达式语言,全称 XML Path Language,用于在 XML 文档的树状结构中定位和选取节点,也可对取出的值进行计算。它的名称来自其最具特色的路径表达式,这种写法以类似文件系统路径的方式对 XML 树中的节点进行层次化寻址。XPath 本身不是独立运行的查询工具,而是作为宿主语言的组成部分被嵌入 XSLT、XQuery 等技术之中,也常被单独用于从 XML 或 HTML 文档中提取数据。
定义
XPath 是万维网联盟(W3C)定义的一种表达式语言,用于处理符合 XQuery 与 XPath 数据模型(XDM)的值,其最鲜明的特征是把 XML 文档视为一棵节点树,用路径表达式对树中的节点进行层次化寻址。它既可以从文档中选出节点集合,也提供了把节点转换为字符串、数值或布尔值的规则[1]。
XPath 采用紧凑且非 XML 的语法,便于嵌入统一资源标识符和 XML 属性值之中。它是一种宿主语言内嵌使用的语言,通常配合 XSLT 或 XQuery 发挥作用,其中语义不变的那部分子集还可以用来判断某个节点是否匹配特定模式。
原理
XPath 把 XML 文档抽象为节点构成的树,而不是处理其表层语法。数据模型中的节点包括文档节点、元素节点、属性节点、文本节点、注释节点、处理指令节点和命名空间节点等类别,其中属性节点不被视为其所属元素节点的子节点[2]。文档中节点的先后次序称为文档顺序,它按照对 XML 文件做先序深度优先遍历得到[3]。
路径表达式由若干导航步骤组成,每个步骤最多包含三个部分:轴、节点测试和谓词。轴给出从当前上下文节点出发要选取的节点集合及其排列方向,节点测试规定这些节点应当满足的基本条件,谓词则用方括号中的表达式作进一步筛选[3]。常用的轴有 child、descendant、parent、ancestor、attribute、self、following-sibling 和 preceding-sibling 等;其中 child 是默认轴,attribute 是唯一能够选取属性节点的轴[3]。
求值过程从初始上下文出发,逐步骤地自左向右进行:每一步以上一步的结果节点为上下文,把选中的节点汇集起来作为下一步的输入,整个表达式的结果就是最后一步的结果[3]。当返回的是节点序列时,结果按文档顺序排列并去除重复节点;当返回的是原子值时,顺序和重复值都予保留[3]。
XPath 允许把常见写法缩略表达,例如省略的轴默认按 child 处理,@ 等同于 attribute::,双斜杠 // 等同于 /descendant-or-self::node()/,点号表示自身节点,连续两个点号表示父节点[3]。以斜杠开头的表达式称为绝对路径,从文档节点起算;不以斜杠开头的称为相对路径,从隐含的上下文节点起算[3]。
发展历程
XPath 最初作为 XSLT 与 XPointer 的配套技术出现,第 1.0 版于 1999 年 11 月由万维网联盟发布为正式推荐标准[1]。此后它逐渐脱离配套角色,作为独立语言得到广泛使用,因为一条 XPath 表达式往往可以替代若干行文档对象模型(DOM)接口代码[1]。
XPath 2.0 于 2007 年 1 月发布,2010 年 12 月又推出第 2 版,它与 XQuery 采用相同的数据模型,表达式种类比 1.0 大幅增加[2]。XPath 3.0 于 2014 年发布,引入了一等函数等能力[4]。
XPath 3.1 于 2017 年 3 月 21 日成为 W3C 推荐标准,与 XQuery 3.1 等文档一同发布[5]。这一版把支持 JSON 作为主要动机,向数据模型中加入映射和数组,并配套新增操纵它们的表达式与函数,因此 XPath 的应用范围从 XML 扩展到 JSON[5]。
应用
XPath 最典型的用途是作为 XSLT 与 XQuery 的组成部分。XSLT 自 1.0 版起就以 XPath 为基础,用于指定需要处理的节点和需要取出的值;XQuery 自 XPath 2.0 起把 XPath 纳入自身语法,在其中承担路径选取的职责[6]。XQuery 在 XPath 之上扩展出连接、开窗、分组等操作,可面向可能存放于高性能索引数据库中的多棵文档树执行查询[5]。
在关系数据库和编程语言平台中也有 XPath 的实现。SQLXML 4.0 实现了 W3C XPath 规范的一个子集,允许把 XPath 查询作为统一资源定位符的一部分或写在模板里,配合映射架构从数据库中检索数据。Java 平台则通过 javax.xml.xpath 包提供与具体对象模型无关的接口,用于求值 XPath 表达式并访问求值环境[1]。
由于 HTML 文档同样可以表示为节点树,XPath 也被用于网页数据提取和浏览器自动化。XPath 能够针对文档层级中的特定元素,例如选取带某一属性的全部元素,或取出某个分支内的内容,因此在界面测试中常被用作元素定位方式。在本地化工作中,它还被用来为 XML 文件编写自定义文件类型过滤器,使工具无需依赖正则表达式即可识别需要处理的片段[2]。
局限
XPath 只能处理已经存在于文档中的内容。面对由 JavaScript 等技术动态加载的元素,它无法直接取得,需要借助浏览器自动化工具模拟用户操作后才能获取[7]。作为查询语言,它也只表达选取和取值,不具备复杂连接、分组、开窗等能力,这类操作需要由 XQuery 等在其之上扩展的语言完成[5]。
各版本之间的兼容性并不完全一致。XPath 1.0 的表达式在 3.0 中几乎都能得到相同结果,但存在少量例外;在启用 1.0 兼容模式时,XPath 的行为会与 XQuery 出现多处差异[6][8]。此外 XPath 1.0 只定义了节点集、字符串、数值和布尔值四种数据类型,其对类型的支持明显弱于后续版本[9]。
在网页自动化场景中,基于 XPath 的定位还存在稳定性问题。自动生成的 XPath 选择器较为脆弱,一旦页面结构调整就容易失效;针对两个应用的实验显示,绝对定位方式在标签和模板发生变动时失败率较高,相对定位方式则对目标标签及其近邻的改动比较敏感[10]。有的实现在规范之外还有自身限制,例如 SQLXML 4.0 不支持根查询、文档顺序并不总是确定,因而未实现依赖文档顺序的数字谓词和轴。
参见
参考资料
- package-summary [引用日期2026-10-14]
- globalizationpartners.com 上的网页 [引用日期2026-10-14]
- B4M36DS2, BE4M36DS2: Database Systems 2 [引用日期2026-10-14]
- XPath [引用日期2026-10-14]
- w3.org 上的网页 [引用日期2026-10-14]
- XPath basic principles [引用日期2026-10-14]
- XPath如何处理动态加载内容 [引用日期2026-10-14]
- XML Path Language (XPath) 3.1 [引用日期2026-10-14]
- XPath [引用日期2026-10-14]
- 1-s2.0-S0164121223003278-main(PDF) [引用日期2026-10-14]