Java中XPath操作需通过XPathFactory、XPath和XPathExpression协作完成:先创建工厂,再获取XPath实例,编译表达式得可复用XPathExpression,最后对XML文档求值;编译必须用xpath.compile(),不可new,错误抛XPathExpressionException;推荐复用实例以避免重复编译开销。

Java 中使用 XPath 主要通过 XPathFactory、XPath 和 XPathExpression 三者协作完成:先创建工厂,再获取 XPath 实例,编译表达式得到可复用的 XPathExpression,最后对 XML 文档求值。
创建 XPathExpression 实例
不能直接 new,必须通过 XPath.compile() 编译字符串表达式获得。编译过程会检查语法,抛出 XPathExpressionException(如路径写错、函数名拼错)。
- 推荐复用同一个
XPath实例和编译后的XPathExpression,避免重复编译开销 - 若表达式含变量(如动态 ID),可用
XPathVariableResolver配合setXPathFunctionResolver扩展功能 - 示例:
XPathExpression expr = xpath.compile("//book[@category='fiction']/title/text()");
对 Document 执行 XPathExpression
XPathExpression.evaluate() 是核心方法,需传入 Node(通常是 Document 根节点)和返回类型常量(如 XPathConstants.STRING、NUMBER、BOOLEAN、NODE、NODESET)。
- 返回
NODESET时得到NodeList,遍历需注意它是 live list(随文档变化而变) - 返回
NODE时只取第一个匹配节点;无匹配则返回null - 数值型表达式(如
count(//book))必须用XPathConstants.NUMBER,否则报错
处理命名空间的 XPathExpression
XML 含命名空间(如 )时,必须注册 NamespaceContext,否则表达式无法匹配。
立即学习“Java免费学习笔记(深入)”;
- 自定义
NamespaceContext实现getNamespaceURI(String prefix)方法,将前缀映射到 URI - 调用
xpath.setNamespaceContext(...)设置后,表达式才能用前缀(如//rss:channel/title) - 不设上下文时,可用
*:element绕过前缀,但不可靠,不推荐用于生产环境
常见异常与调试技巧
运行时报错多源于表达式语法、类型不匹配或上下文缺失。建议按顺序排查:
- 确认 XML 文档已成功加载且非 null(
DocumentBuilder.parse()可能静默失败) - 用
expr.toString()或日志输出表达式字符串,核对引号、括号、大小写 - 测试简单表达式(如
/或/*)验证基础路径是否通,再逐步加条件 -
XPathExpressionException通常在 compile 阶段抛出;ClassCastException多因 evaluate 返回类型与预期不符










