JAXP是一套标准化接口层,用于统一调用DOM、SAX或StAX等底层XML解析器,通过工厂模式、SPI机制和javax.xml包中三类组件实现厂商无关性与解析方式灵活切换。

JAXP(Java API for XML Processing)不是一种独立的解析技术,而是一套标准化的接口层,用于统一调用底层XML解析器(如Xerces、Crimson等),屏蔽不同厂商实现的差异。它本身不解析XML,而是提供工厂模式+标准API,让开发者能灵活切换DOM、SAX或StAX解析方式,而无需修改业务逻辑代码。
JAXP的核心组成模块
JAXP体系结构主要由三部分构成,全部位于javax.xml及其子包中:
-
解析器工厂类:如
DocumentBuilderFactory(DOM)、SAXParserFactory(SAX)、XMLInputFactory(StAX),负责创建具体解析器实例; -
解析器对象:如
DocumentBuilder、SAXParser、XMLStreamReader,执行实际解析动作; -
结果处理与转换工具:如
TransformerFactory和XPathFactory,支持XSLT变换和XPath查询,扩展了XML处理能力。
JAXP如何实现厂商无关性
关键在于“服务提供者机制(SPI)”。JAXP不硬编码解析器实现,而是通过META-INF/services配置文件查找可用的解析器实现类。例如:
- 系统默认使用JDK内置的Xerces解析器;
- 若在classpath中加入
xercesImpl.jar并配置javax.xml.parsers.DocumentBuilderFactory指向其自定义工厂,则所有DocumentBuilderFactory.newInstance()调用都会返回Xerces的实现; - 也可通过
System.setProperty()或JVM参数显式指定工厂类,实现运行时动态替换。
JAXP支持的三种解析模型对比
每种模型对应不同场景,JAXP为它们提供了统一的接入路径:
立即学习“Java免费学习笔记(深入)”;
-
DOM模式:适合需随机访问、频繁修改XML树结构的场景。JAXP通过
DocumentBuilder.parse()加载整棵树到内存,生成org.w3c.dom.Document对象; -
SAX模式:适合大文件流式解析、内存受限环境。JAXP用
SAXParser.parse()触发事件回调(ContentHandler),不保留文档结构; -
StAX模式:介于DOM与SAX之间,支持拉模式(pull parsing)。JAXP通过
XMLInputFactory创建XMLStreamReader,由程序主动控制解析节奏,兼顾灵活性与低内存占用。
JAXP的典型使用流程(以DOM为例)
四步完成基础解析,体现其面向接口的设计思想:
- 调用
DocumentBuilderFactory.newInstance()获取工厂实例; - 设置工厂属性(如
setNamespaceAware(true)启用命名空间支持); - 通过
newDocumentBuilder()获得DocumentBuilder对象; - 执行
parse(InputStream)得到Document,后续即可用W3C DOM API遍历或操作节点。










