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