如何测试 XPath 表达式
- 粘贴 XML、打开文件,或使用示例商品目录。
- 输入 XPath 表达式,或点击任一示例。结果会随输入实时更新,按 Enter 键可立即执行。
- 查看结果:匹配节点的数量及其类型和内容,或表达式返回的数字、字符串或布尔值。
XPath 语法速查表
| 表达式 | 选取的内容 |
|---|---|
/catalog | 根元素 catalog |
//product | 任意层级的所有 product 元素 |
/catalog/product/name | 从根节点逐级选取每个商品的 name |
//product/@id | 每个商品的 id 属性 |
//product[@category='books'] | category 属性为 books 的商品 |
//product[price > 20] | 价格高于 20 的商品(按数字比较) |
//product[contains(name, 'USB')] | 名称包含“USB”的商品(区分大小写) |
//product[not(tags)] | 没有 tags 子元素的商品 |
(//product)[1] | 文档中的第一个商品 |
//product[1] | 每个父元素中的第一个商品 |
//product[last()] | 每个父元素中的最后一个商品 |
//name/text() | name 中的文本节点 |
//price/.. | 每个 price 的父元素 |
//*[local-name()='product'] | 任意命名空间中的 product 元素 |
count(//product) | 商品数量 |
sum(//price) | 所有价格的总和 |
string(//product[1]/name) | 以字符串形式返回第一个商品的名称 |
XPath 中的命名空间
XPath 1.0 没有默认命名空间的概念。在带有 xmlns="…" 的文档(例如 sitemap 或 NF-e 发票)中,//url 什么也找不到,因为这些元素属于该命名空间。因此,本工具会把默认命名空间映射到前缀 x:(如果 x 已被占用,则使用 d:),这样 //x:url/x:loc 就能正常工作。文档中已声明的前缀(例如 CFDI 发票中的 cfdi:)可以直接使用。在无法配置命名空间的工具中,//*[local-name()='url'] 写法在任何地方都适用。
常见问题
支持哪个版本的 XPath?
支持 XPath 1.0,即所有浏览器和大多数 XML 库内置的版本。XPath 2.0 及更高版本中的函数,例如 matches()、lower-case() 或 string-join(),均不可用。
为什么我的 XPath 什么也查不到?
最常见的原因有:文档使用了默认命名空间(请使用示例下方提示的 x: 前缀);大小写不一致——XPath 区分大小写;以及位置序号从 1 开始,而不是从 0 开始。
会显示多少条结果?
所有匹配项都会计数,并列出前 500 个匹配项的节点类型和内容。
我的 XML 会被上传吗?
不会。XML 的解析和查询都在你的浏览器中进行。只有通过 URL 加载的文件才会经由我们的服务器获取。