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.apache.xerces.parsers.DOMParser)。JAXP 的价值在于:
立即学习“Java免费学习笔记(深入)”;
- 系统属性或服务发现机制(
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 处理就稳了。










