关于JDK若干重要XML处理组件的分析:
Java定义了相关包路径用于处理XML文档的一般接口规范(注意:这里是规范,也就是xml操作接口,它不是实现类),比如:
- javax.xml.parser, 用于采用DOM或者SAX解析xml文档,其中DocumentBuilderFactory和SAXParserFactory分别是DOM和SAX各自的JAXP工厂调用类
- javax.xml.stream, 用于采用STAX解析xml文档,其中XMLInputFactory是JAXP工厂调用类
- javax.xml.transform, 用于XSLT对xml文档进行转换,其中TransformerFactory是JAXP工厂调用类
- javax.xml.validation, 用于Schema校验xml文档,其中SchemaFactory是JAXP工厂调用类
- javax.xml.xpath, 用于XPath访问xml文档,其中XPathFactory是JAXP工厂调用类
那么,既然这些都是接口规范,那具体的实现在哪里呢?
1. JDK本身全部有一套实现,它们都被打包在rt.jar文件中,比如:
DocumentBuilderFactory的实现类是
com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl
SAXParserFactory的实现类是
com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl
SchemaFactory的实现类是
com.sun.org.apache.xerces.internal.jaxp.validation.XMLSchemaFactory
XPathFactory的实现类是
com.sun.org.apache.xpath.internal.jaxp.XPathFactoryImpl
TransformerFactory的实现类是
com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl
XMLInputFactory的实现类是
com.sun.xml.internal.stream.XMLInputFactoryImpl
由于这些已经都是JDK本身提供,因此它和第三方代码没有耦合性,所以它们最主要的使用场景是在服务器环境下,比如Tomcat服务器,为了与其中的WebApp更好的隔离,Tomcat服务器自身用到的xml解析和保存都是通过JDK本身所提供的组件。
说是JDK的自身实现,但其实它只是把Apache的Xerces项目抄过来,改了包路径而已。
2. 来自于第三方提供的实现。这些实现往往有着更好的性能或提供更多的特性支持,所以在一些用户开发的应用中使用更广泛,这些需要引入第三方包。
- 比如Apache的Xerces.jar项目中,
DocumentBuilderFactory的实现类是
org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
SAXParserFactory的实现类是
org.apache.xerces.jaxp.SAXParserFactoryImpl
SchemaFactory的实现类是
org.apache.xerces.jaxp.validation.XMLSchemaFactory
- 比如Sourceforge的Saxon.jar项目中,
TransformerFactory的实现类是
net.sf.saxon.TransformerFactoryImpl
- 比如Sourceforge的Saxon9-dom.jar项目中,
DocumentBuilderFactory的实现类是
net.sf.saxon.dom.DocumentBuilderFactoryImpl
3. 以上方式都是基于w3c中的标准DOM结构的解析方式。此外,还有一些第三方自定义的DOM结构及解析。
比如DOM4j和JDOM,当然它们也能在自己的DOM结构和w3c的DOM结构之间进行来回转换,以及对XML文档进行解析和保存,但它们本身并不是xml的完整解析器,因此仍需要依赖JDK的xml解析器或者Apache-Xerces