若要返回 NodeList,必须显式指定 XPathConstants.NODESET;否则默认转为字符串。正确写法:xpath.evaluate(expression, doc, XPathConstants.NODESET),再强制转换为 NodeList 遍历。

Java 的 XPath.evaluate() 方法默认返回字符串、数字或布尔值,**若要返回节点列表(如 NodeList),必须显式指定返回类型为 XPathConstants.NODESET**,否则会自动转换为字符串(只取第一个匹配节点的文本内容)。
正确获取 NodeList 的写法
调用 evaluate() 时,第三个参数传入 XPathConstants.NODESET:
Document doc = ...; // 已解析的 XML 文档
XPath xpath = XPathFactory.newInstance().newXPath();
String expression = "//book/title";
// ✅ 正确:返回 NodeList
Object result = xpath.evaluate(expression, doc, XPathConstants.NODESET);
// 转为 NodeList 并遍历
NodeList nodeList = (NodeList) result;
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
System.out.println(node.getTextContent());
}
常见错误与注意事项
- 不传第三个参数,或传
XPathConstants.STRING:结果是字符串(仅第一个匹配节点的文本),无法遍历所有节点 - 强制转型前务必检查
result是否为NodeList类型(可用instanceof判断) - 如果 XPath 表达式不匹配任何节点,
NodeList长度为 0,不会抛异常,但item(0)会返回null - 注意命名空间:若 XML 含命名空间,需配置
NamespaceContext,否则表达式可能查不到节点
其他常用返回类型对照
除了 NODESET,还可按需选择:
-
XPathConstants.NODE:返回单个Node(第一个匹配项,无匹配则为null) -
XPathConstants.STRING:返回字符串(所有匹配节点合并后的文本,或第一个节点的文本) -
XPathConstants.BOOLEAN或NUMBER:用于判断存在性或数值计算
简化写法(Java 7+ 推荐)
可直接声明类型,避免显式转型:
立即学习“Java免费学习笔记(深入)”;
NodeList titles = (NodeList) xpath.evaluate("//book/title", doc, XPathConstants.NODESET);
或配合 try-with-resources(若使用支持的解析器)和更安全的类型检查进一步健壮化处理。










