工具介绍
XPath(XML Path Language)是 W3C 制定的标准,用一种紧凑的类路径语法在 XML 文档中导航和选取节点——元素、属性、文本,例如 `//book[price>30]/title` 会选出文档任意位置中,其同级 `<price>` 大于 30 的所有 `<title>`。它被广泛用于 XSLT 样式表、XML 校验工具、网页抓取程序、浏览器自动化框架(Selenium、Playwright)以及许多编程语言的 XML 库中。
目前 Chrome、Firefox、Safari、Edge 等所有主流浏览器实现的版本都是 XPath 1.0,也就是 1999 年发布的原始 W3C 推荐标准。这个工具通过浏览器的 `document.evaluate()` API 使用的正是这套原生引擎,因此这里的结果与你在浏览器 DevTools 或任何浏览器端 JavaScript 中运行同一表达式得到的结果完全一致。它不支持之后的 XPath 2.0/3.0/3.1 规范(那些版本新增了 `for` 表达式、序列、正则匹配等功能)——常见问题部分对此有更详细的说明。
一条表达式可能返回两种结果之一:一个节点集(零个或多个匹配的元素、属性或文本节点,这个工具会将其序列化并逐行列出,附带数量),或者一个标量值——数字、字符串或布尔值——当表达式本身就是在计算一个值时,比如 `count(//book)` 或 `//book[1]/title = 'Dune'`。
为什么使用它?
- 在把 XPath 表达式硬编码进网页抓取程序、Selenium/Playwright 测试或 XSLT 样式表之前先调试一遍。
- 快速核实某条 XPath 是否能从真实的 XML/HTML 样本中选出你期望的节点。
- 直接查看精确的匹配数量和序列化输出,而不用靠代码去猜。
- 对格式错误的 XML 或无效的 XPath 语法,立即得到可读的错误提示,而不是一堆看不懂的堆栈信息。
- 100% 客户端运行:你的 XML 和表达式不会离开浏览器。
使用方法
- 在输入框中粘贴或编辑你的 XML(或 HTML)——已预填一个书店示例文档,方便你立刻看到效果。
- 在表达式输入框中输入一条 XPath 表达式,或者直接编辑预填的示例。
- 点击"求值"(或在表达式输入框中按回车)。
- 在下方查看匹配到的节点,顶部会显示数量;标量结果(数字、字符串、布尔值)会直接显示。
- 如果 XML 或表达式无效,结果区域会显示具体的错误信息。
示例
输入
XML:
<bookstore>
<book><title>The Great Gatsby</title><price>12.99</price></book>
<book><title>Learning XPath</title><price>34.50</price></book>
<book><title>Dune</title><price>45.00</price></book>
</bookstore>
XPath: //book[price>30]/title输出
✓ 2 node(s) matched
<title>Learning XPath</title>
<title>Dune</title>三本书中只有两本价格超过 30,所以恰好返回了 2 个 <title> 元素——第三本书(Gatsby,$12.99)被正确排除在外。
XPath 与 CSS 选择器速览对比
两种语言都用于从文档中选取节点,但解决的问题不同。用下表来判断某次选取该用哪种工具。
| 能力 | XPath | CSS 选择器 |
|---|---|---|
| 按标签/class/id 向下选取 | 支持 | 支持——通常更快 |
| 按可见文本/内容选取 | 支持——`contains(text(),'x')` | 不支持 |
| 向上遍历到父/祖先节点 | 支持——`//div[span]/..` | 不支持(`:has()` 是较新的部分例外) |
| 同级值比较(如 `price>30`) | 支持 | 不支持 |
| 可脱离浏览器使用(服务端 XML 工具、XSLT) | 支持 | 不支持——CSS 选择器专属于浏览器/DOM |
相关工具
正在处理结构化数据格式?这些工具和 XPath 测试搭配使用效果不错。
→ JSON 格式化工具 · JWT 解码器
常见问题
XPath 有什么用?
XPath 用路径语法从 XML 或 HTML 文档中选取节点——元素、属性或文本。它是 XSLT 转换、许多 XML 校验工具背后的选取语言,也广泛用于网页抓取和浏览器测试自动化(Selenium、Playwright、Cypress)中定位页面元素,尤其是在单靠 CSS 选择器无法表达所需条件时。
XPath 和 CSS 选择器该用哪个?
两者有重叠但并不等价。XPath 可以根据子元素内容选取父元素(`//div[span='Total']`),可以向上遍历到祖先节点,还可以按可见文本选取(`//button[contains(text(),'Submit')]`)——CSS 选择器做不到向上遍历,也完全无法根据文本内容匹配。如果只是按标签、class 或 ID 沿文档向下选取,CSS 选择器写起来更简单,求值通常也更快。当你需要"选取这段文本的父元素"或"根据元素显示的内容来选取",而不只是根据标签或 class 时,才应该用 XPath。
这个工具支持 XPath 2.0 或 3.0 的函数吗?
不支持——事实上没有任何浏览器支持。浏览器通过 `document.evaluate()` 实现的是 XPath 1.0(1999 年的 W3C 推荐标准),这个工具使用的正是这套原生引擎,因此结果和你在浏览器 DevTools 或 JavaScript 中运行同一表达式得到的完全一致。XPath 2.0/3.0/3.1 中引入的函数和特性(比如 `for` 表达式、序列,或带正则的 `matches()`)在这里都不可用——只有 `contains()`、`starts-with()`、`substring()`、`count()`、`position()`、`last()` 这类 1.0 函数才能使用。
有哪些常用的 XPath 表达式值得了解?
`//tag` 选取文档中任意位置的所有 `<tag>`。`//tag[@attr='value']` 选取 `attr` 属性等于 `value` 的 `<tag>` 元素。`//tag[contains(text(),'x')]` 选取直接文本内容包含 `x` 的 `<tag>` 元素。`//tag[1]` 选取每个父元素下第一个 `<tag>` 同级节点。`//parent/child` 选取 `<parent>` 的直接子元素 `<child>`。`count(//tag)` 返回一个数字而不是节点集。
这个工具支持 XML 命名空间吗?
只完善支持了最常见的无命名空间场景,这也覆盖了绝大多数手写或抓取得到的 XML/HTML。如果你的文档在根元素上声明了 XML 命名空间(例如 `xmlns="..."`),`document.evaluate` 就需要一个能感知命名空间的解析函数,将前缀映射到 URI,而这个简易工具没有配置这一层——针对带命名空间的 XML,表达式即使看起来正确也可能返回零匹配。这是已知的限制,不是 bug:你可以去掉样本中的命名空间声明,或者用 local-name() 函数作为变通方案(例如 `//*[local-name()='title']`)。
我的 XML 或 XPath 表达式会被发送到服务器吗?
不会。所有计算都在本地使用浏览器内置的 `DOMParser` 和 `document.evaluate()` 完成——正是浏览器自身内部已经在使用的那套引擎。你输入或粘贴的任何内容都不会离开你的设备。