XML 工具

XPath 测试查清表达式为什么匹配不到

点击求值或按 Ctrl/Cmd+Enter;修改输入、映射或结果视图后重新运行。

XPath 测试

XML 输入

结果

XML 和表达式仅在当前浏览器处理,不向服务器发送文档。

使用 ASCII 前缀,例如 {"b":"urn:books"};原文前缀可以不同。

XPath 1.0,按 Ctrl/Cmd+Enter 手动运行。标量在 JSON 中用字符串表示,保留 NaN 和 Infinity。

结果已过期,重新求值后才能导出。

XPath 测试适合排查样例正常、真实接口数据却没有匹配的情况。默认命名空间、属性条件以及后代节点的位置,都会改变同一条表达式的含义。

XPath 在线测试保留原始 XML 文本,不会先格式化再查询。比较 XPath 表达式的节点结果与字符串值,可以看清嵌套文本、空白和 XML 命名空间究竟影响了哪一步。

为什么使用 XPath 测试?

让选中的分支看得见

XPath 测试区分节点、文本和绝对路径。同样选中两本书的标题,可以查看两个序列化片段、两个文本值或两条可回查的路径;切换视图不会改写原文。

XML 树中的两个标题分支被选中,提取为两项结果。

按命名空间 URI 绑定

前缀只是别名。把 b 绑定到 urn:books 后,可以用 //b:book 查询原文采用其他前缀的节点;另一个命名空间里的同名元素不会混入结果。

两个命名空间中的同名节点分组,仅选中映射对应的一组。

三个容易忽略的查询细节

01

给默认命名空间取别名

原文出现 xmlns="urn:books" 时,填入 {"b":"urn:books"} 并使用 //b:book。直接写 //book 只会匹配没有命名空间的元素。

02

区分文本视图与 text()

文本视图读取每个选中节点的完整字符串值,包含后代文本。//title/text() 则只选中直接文本节点,混合内容中的这两种结果可能不同。

03

导出前检查是否重新运行

修改 XML、表达式、映射或视图后,复制与下载立即禁用。成功重新求值才可导出;界面每次增加 50 条结果,导出包含本次全部成功结果。

从节点选取到结果核对

保留四种结果类型

查询可以产生节点集合、字符串、数字或布尔值。count(//book)、string(//title) 和 boolean(//missing) 的类型分别保留。JSON 的 values 数组统一使用字符串,因此 NaN 与 Infinity 不会被偷偷变成 null。

提取属性并设置条件

//book[@id="b1"] 按属性筛选元素,//@id 提取属性,//book[price>15]/title 使用数字条件。匹配数量为 0 仍然成功,结果中的 values 是空数组,可以正常复制和下载。

生成能够回查的路径

路径包含同名兄弟节点的位置。带命名空间的元素使用 local-name() 与 namespace-uri(),不依赖当前前缀映射;路径只对应当前文档,结构改变后索引也可能改变。

版本、输入与运行限制

只支持 XPath 1.0
XPath 测试使用浏览器实际求值引擎,不支持 XPath 2.0/3.1、matches()、ends-with()、变量或 XQuery。namespace:: 轴的结果存在浏览器差异,不作跨浏览器保证。
严格 XML,不修复原文
只接受完整且格式正确的 XML 1.0;拒绝 DTD 和外部实体。显式编码声明只接受 UTF-8。不会替 HTML 补标签,也不会删除可能影响文本查询的空白。 为符合 XPath 文本模型,会合并相邻文本与 CDATA;节点序列化可能把 CDATA 标记改成转义文本,但字符内容不变。
显式绑定前缀
映射必须是 JSON 对象,键使用 ASCII 前缀,值是非空命名空间 URI。空前缀和 xmlns 不可用;xml 只能绑定标准 URI。原文使用非 ASCII 前缀时,可以用同 URI 的 ASCII 别名查询。
容量有界,求值同步
限制为输入 100,000 字符、XML 2,000 个节点(含属性及文本)、深度 100、表达式 2,000 字符、匹配 1,000 条、输出 2,000,000 字符。超限整次失败,不导出截断结果;原生同步求值没有硬超时,复杂查询可能让页面短暂停顿。
输入与撤销范围
本页只接收粘贴文本,不提供 URL 导入、文件上传、保存分享或 Schema 验证。清空及载入示例先显示预览;应用后替换原文与选项,撤销一次可以同时恢复输入、参数与结果。

XPath 测试常见问题

XPath 如何选取子节点、属性和文本?

子节点用 / 连接,例如 /library/book;属性用 @id;直接文本用 text()。要获取整个元素含后代的文本,可以选中元素后改用文本视图并重新求值。

支持 XPath 2.0 或 3.0 吗?

不支持。实际运行的是浏览器原生 XPath 1.0 引擎。matches() 等高版本函数需要另一套引擎,表达式被拒绝并不代表 XML 内容有错。

怎样根据属性筛选元素?

//book[@id="b1"] 选取指定属性的元素,//book/@id 提取属性值。属性名区分大小写,没有前缀的属性不会继承默认命名空间。

XPath 中 / 和 // 有什么区别?

单斜杠选择下一层直接节点,双斜杠从当前位置搜索后代。/library/book 固定从根元素往下查,//book 则可以找到更深层的 book。

带命名空间的文档为什么没有匹配?

XML 的默认命名空间覆盖无前缀元素,但 XPath 1.0 中无前缀的名称并不自动使用它。为 URI 绑定别名,再在表达式中使用这个别名。

发现了意外结果?

验证下一条查询

用 XPath 测试保留明确的命名空间映射和可核对的结果类型。排查差异时,把成功表达式与对应 XML 样例一起记录,便于再次复现。