如何为含空格的JSON字段编写XPath?咨询XPath 4.0使用及依赖
带空格JSON字段的XPath写法及XPath 4.0使用说明
先解决XPath 3.1里的可行方案
你之前试的?1?email id不生效,是因为XPath 3.1里带空格的JSON键不能直接裸写,得把键名用字符串字面量包起来再用括号括住。正确写法是:
$json?1?('email id')
或者简化成:
$json?1('email id')
这样就能正常取出"email id"字段的值了,不用急着升级到4.0。
如何使用XPath 4.0及所需依赖
XPath 4.0确实支持?1?'email id'这种更直观的写法,但目前支持它的处理器不多,主流的是Saxon 12及以上版本(推荐用最新的13.x版本,支持更完善)。
依赖配置(以Java/Maven为例)
如果是Java项目,直接在pom.xml里添加Saxon-HE的依赖:
<dependency> <groupId>net.sf.saxon</groupId> <artifactId>Saxon-HE</artifactId> <version>13.1</version> </dependency>
Gradle项目的依赖配置:
implementation 'net.sf.saxon:Saxon-HE:13.1'
简单使用示例(Java)
下面是完整示例代码,用来解析JSON并执行XPath 4.0表达式:
import net.sf.saxon.s9api.*; import java.io.StringReader; public class XPath4JsonDemo { public static void main(String[] args) throws SaxonApiException { // 示例JSON数据 String jsonData = "[{\"name\":\"Ram\", \"email id\":\"ram@gmail.com\", \"age\":23},{\"name\":\"Shyam\", \"email id\":\"shyam23@gmail.com\", \"age\":28}]"; // 初始化Saxon处理器 Processor saxonProcessor = new Processor(false); XPathCompiler xpathCompiler = saxonProcessor.newXPathCompiler(); // 声明使用XPath 4.0 xpathCompiler.setLanguageVersion("4.0"); // 启用JSON处理命名空间 xpathCompiler.declareNamespace("json", "http://saxon.sf.net/json"); // 将JSON解析为XPath可处理的序列 XdmNode jsonNode = saxonProcessor.newJsonParser().parse(new StringReader(jsonData)); XdmValue jsonSequence = XPathEvaluator.convertJsonToXPath(jsonNode, saxonProcessor); // 编译XPath 4.0表达式 XPathExecutable executable = xpathCompiler.compile("?1?'email id'"); XPathSelector selector = executable.load(); selector.setContextItem(jsonSequence); // 获取并打印结果 XdmItem result = selector.evaluateSingle(); System.out.println(result.getStringValue()); // 输出 ram@gmail.com } }
注意事项
- XPath 4.0目前还是W3C候选推荐版本,不同处理器支持程度有差异,优先选择最新版Saxon。
- 非Java环境(比如Python)暂时没有原生支持XPath 4.0的成熟库,可通过调用Saxon的CLI工具,或用Jython间接使用。
内容的提问来源于stack exchange,提问作者Sujit Kumar
相关产品推荐
相关产品推荐

