JAXP是Java解析XML的标准API,通过工厂模式(DocumentBuilderFactory、SAXParserFactory、TransformerFactory)解耦解析器实现,支持DOM、SAX、StAX及XSLT转换,并可动态切换底层解析器和启用XML Schema验证。

Java中JAXP是Java API for XML Processing的缩写,是一套用于解析、验证和转换XML文档的标准接口集合。它不直接实现解析逻辑,而是通过工厂类屏蔽底层解析器差异,使开发者可在不修改代码的前提下切换SAX、DOM或StAX等不同解析机制。以下是JAXP API的核心使用方式:
一、JAXP核心工厂与解析器体系
JAXP将解析器创建过程抽象为工厂模式,避免硬编码具体实现类。所有解析器实例均由对应工厂生成,确保可插拔性与厂商中立性。
1、DocumentBuilderFactory用于创建DOM解析器,调用newInstance()获取工厂实例,再通过newDocumentBuilder()获得DocumentBuilder对象。
2、SAXParserFactory用于创建SAX解析器,调用newInstance()后通过newSAXParser()获取SAXParser实例,配合自定义DefaultHandler处理事件流。
立即学习“Java免费学习笔记(深入)”;
3、TransformerFactory用于XSLT转换,调用newInstance()后通过newTransformer()或newTransformer(Source stylesheet)构建转换器,支持XML到HTML、文本或其他XML格式输出。
二、DOM解析XML文件
DOM解析将整个XML加载为内存中的树状结构,适合需随机访问、增删改查节点的场景。其操作基于W3C DOM标准接口,所有节点类型均继承自Node接口。
1、调用DocumentBuilderFactory.newInstance()获取工厂实例。
2、设置factory.setNamespaceAware(true)启用命名空间支持(如需)。
3、调用factory.newDocumentBuilder()创建DocumentBuilder对象。
4、使用builder.parse(InputStream)或builder.parse(File)加载XML源,返回Document根对象。
5、通过document.getDocumentElement()获取根元素,再调用getElementsByTagName()、getChildNodes()等方法遍历操作节点。
三、SAX解析XML文件
SAX采用事件驱动模型,逐行读取XML并触发startElement()、endElement()、characters()等回调,内存占用极低,适用于大文件或流式处理场景。
1、定义一个继承org.xml.sax.helpers.DefaultHandler的处理器类,重写关键事件方法。
2、调用SAXParserFactory.newInstance()获取工厂实例。
3、调用factory.setNamespaceAware(true)或factory.setValidating(true)配置校验行为(如需)。
4、调用factory.newSAXParser()获取SAXParser实例。
5、调用parser.parse(InputSource, handler)启动解析,所有事件交由handler处理。
四、切换底层XML解析器实现
JAXP通过Java系统属性动态绑定具体解析器实现,无需更改业务代码即可替换Xerces、Crimson或第三方解析器,满足合规或性能定制需求。
1、在调用工厂newInstance()前,执行System.setProperty("javax.xml.parsers.DocumentBuilderFactory", "org.apache.xerces.jaxp.DocumentBuilderFactoryImpl")指定DOM工厂实现类。
2、同理,设置System.setProperty("javax.xml.parsers.SAXParserFactory", "org.apache.xerces.jaxp.SAXParserFactoryImpl")切换SAX工厂。
3、也可通过命令行参数-Djavax.xml.parsers.DocumentBuilderFactory=...在JVM启动时注入,优先级高于代码设置。
4、若未显式设置,JAXP按服务提供者机制(SPI)查找META-INF/services/javax.xml.parsers.DocumentBuilderFactory文件中声明的实现类。
五、启用XML Schema验证
JAXP支持在解析阶段进行W3C XML Schema校验,确保XML结构符合预定义约束。验证失败将抛出SAXParseException,可捕获并定位错误位置。
1、DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
2、调用factory.setValidating(true)启用DTD验证,或factory.setSchema(schema)绑定Schema对象启用XSD验证。
3、调用factory.setNamespaceAware(true),因XSD依赖命名空间,此步为强制前提。
4、通过SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema")加载XSD文件,生成Schema对象传入factory.setSchema()。
5、创建DocumentBuilder后,其parse()方法将在解析时自动执行校验,未通过校验将中断解析并抛出异常。










