You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中使用XPath for表达式报错,寻求正确使用方法

这个问题我之前踩过坑,核心原因其实是Java自带的XPath工具默认只支持XPath 1.0,而你写的for $x in * return $x是XPath 2.0及以上才有的FLWOR表达式语法,所以JDK的解析器认不出这些语法,就会报非法token的错误。

解决方法:使用支持XPath 2.0的库(比如Saxon)

Java标准库的javax.xml.xpath只实现了XPath 1.0,要使用for循环这类高级特性,需要换用支持XPath 2.0/3.0的第三方库,最常用的是Saxon(开源的HE版本完全够用)。

1. 引入Saxon依赖

如果用Maven,在pom.xml里添加:

<dependency>
    <groupId>net.sf.saxon</groupId>
    <artifactId>Saxon-HE</artifactId>
    <version>12.4</version> <!-- 可替换为最新稳定版 -->
</dependency>

如果是Gradle,添加:

implementation 'net.sf.saxon:Saxon-HE:12.4'

2. 修改代码使用Saxon的XPath实现

替换原来的XPathFactory创建方式,改用Saxon的实现,就能正常运行XPath 2.0的for表达式了:

import net.sf.saxon.xpath.XPathFactoryImpl;
import org.w3c.dom.Document;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;

// ... 你的其他初始化代码(比如加载docXML)

// 关键:替换为Saxon的XPathFactory实现
XPathFactory xpathFactory = new XPathFactoryImpl();
XPath m_xpath = xpathFactory.newXPath();

String expr = "for $x in * return $x";
// 执行表达式并获取节点列表
NodeList nodeList = (NodeList) m_xpath.evaluate(expr, docXML, XPathConstants.NODESET);

// 遍历结果示例
for (int i = 0; i < nodeList.getLength(); i++) {
    System.out.println(nodeList.item(i).getNodeName());
}

补充小技巧

如果你不想显式指定XPathFactoryImpl,也可以通过设置系统属性让JDK默认加载Saxon的工厂:

System.setProperty("javax.xml.xpath.XPathFactory:" + XPathConstants.DOM_OBJECT_MODEL, 
                   "net.sf.saxon.xpath.XPathFactoryImpl");
// 之后再用默认方式创建XPathFactory即可
XPathFactory xpathFactory = XPathFactory.newInstance();

内容的提问来源于stack exchange,提问作者yas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 07:54:10