Java JAXP是什么 Java API for XML Processing详解

JAXP是Java平台处理XML的标准可插拔API,统一支持解析、转换、验证和查询四类操作,通过工厂类屏蔽底层实现差异,需注意XXE等安全配置。

JAXP 是 Java 平台中处理 XML 的标准接口层,不是具体解析器,而是一套“可插拔”的抽象 API,让你的代码不绑定某个厂商的 XML 实现(比如 Xerces、Woodstox),换解析器不用改业务逻辑。

JAXP 的核心能力

它统一支持四类 XML 操作:

  • 解析:用 DOM(树形加载)、SAX(事件流式)或 StAX(拉模式流)读取 XML
  • 转换:通过 XSLT 将 XML 转成 HTML、文本或其他 XML 格式
  • 验证:配合 DTD、XML Schema(XSD)检查文档结构合法性
  • 查询:用 XPath 快速定位节点,比如 //book[@category='fiction']/title

JAXP 的关键工厂类

所有功能都从这几个工厂类开始,它们屏蔽底层实现差异:

  • DocumentBuilderFactory:创建 DOM 解析器(DocumentBuilder),适合需随机访问、修改 XML 的场景
  • SAXParserFactory:创建 SAX 解析器(SAXParser),内存占用低,适合大文件或只读遍历
  • TransformerFactory:创建 XSLT 转换器(Transformer),支持样式转换和序列化输出
  • XMLInputFactory / XMLOutputFactory:StAX 的入口,提供更可控的流式读写(Java 6+,JAXP 1.4 起内置)

为什么需要 JAXP 而不只是用 DOM 或 SAX?

直接调用 DOM 或 SAX 接口会硬编码依赖某个解析器(如 org.apach

e.xerces.parsers.DOMParser)。JAXP 的价值在于:

  • 系统属性或服务发现机制(META-INF/services)可动态切换底层实现
  • 默认使用 JDK 自带解析器(如 Crimson 或 Xalan),无需额外引入 jar
  • 企业级应用可通过配置切换为高性能商业解析器(如 Saxon-EE),代码零改动

安全使用要注意什么

JAXP 默认配置可能开启危险特性,处理不可信 XML 时必须显式禁用:

  • 关闭外部实体(XXE):factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true)
  • 限制实体扩展深度:factory.setAttribute("http://www.oracle.com/xml/jaxp/properties/entityExpansionLimit", 0)
  • DOM/SAX/StAX 解析器均需单独设置,不能只设一个工厂

基本上就这些。它不复杂但容易忽略细节——尤其是安全配置和工厂获取方式。用对了,XML 处理就稳了。