Java中JAXP是什么 JAXP API使用详解

3次阅读

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

Java中JAXP是什么 JAXP API使用详解

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()方法将在解析时自动执行校验,未通过校验将中断解析并抛出异常

text=ZqhQzanResources