`

JAXP SAX DOM StAX

阅读更多

SAX: Simple API for XML

DOM: Document Object Model

JAXP: Java API for XML Processing

StAX: The Streaming API for XML

 

1、SAX, DOM是两种对xml文档进行分析的方法(没有具体的实现,只有接口)所以他们不是解释器,仅仅靠他们是完成不了对xml文档的处理的。

sax的包是org.xml.sax

dom的包是org.w3c.dom

包的名称很重要,它有助于你理解他们之间的关系。 可见,DOM是W3C的官方规范。

容易混淆的是,人们常说用JDK中自带的SAX/DOM方式来解析XML (相对于与JDom和Dom4J的解析方式),确实,JDK不需要引入任何额外的依赖就可以解析XML,貌似是JDK自己实现了SAX/DOM,这是为什么呢?其实就是JAXP在作怪,它偷偷的把别人的一些实现包进了JDK中,继续往下看。

 

2. JAXP

Sun在XML领域总是后知后觉,等到Sun重视XML的时候,XML的API早就满天飞了,尤其是IBM具有非常大的领先优势。不过Sun是规范的制订者,于是参考W3C的标准制订了JAXP规范。

所以JAXP也不是具体的实现,只是个API,所以仅有JAXP也是无法工作的。它封装了SAX/DOM两种接口(后来又添加了STAX接口)。并在SAX/DOM的基础上作了一套比较简单的API以供开发人员使用。

JAXP的包是javax.xml.parsers

 

 

JAXP它只是一个规范,完成了对SAX、DOM的包装,生成了DocumentBuilderFactory、 DocumentBuilder和SAXParserFactory、SAXParser。也就是设计模式中的工厂模式,他的好处就是具体的对象(解释器)建立由子类完成。JAXP的作用就是提出一个统一的接口,让其它的XML API都来遵循JAXP编程。当你严格采用JAXP编程的时候,是遵循W3C的DOM标准的,那么在JAXP底层你实际上可以任意切换不同的DOM实现(也就是解释器),例如Xerces,或者Crimon,再或者其它,切换方法就是配置jaxp.properties。因此JAXP就是一些标准接口而已。

 

JAXP应用程序 -> JAXP接口 -> Xerces DOM实现 -> Xerces DOM/SAX 解析器

JAXP应用程序 -> JAXP接口 -> Crimson DOM实现 -> Crimson DOM/SAX 解析器

JAXP应用程序 -> JAXP接口 -> Crimson DOM实现 -> Xerces DOM/SAX 解析器

 

比如,先以DOM为例,当实例化一个DocumentBuilderFactory的时候是用

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

这个newInstance()就是先去jaxp.properties中去找你配置好的实现类,如果找不到,就会回滚到默认的

com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl

显然这个就是人家Apache对JAXP的实现类,只是被放到了JDK默认的包里。

 

同样的道理,JDK的SAX是用

SAXParserFactory sf = SAXParserFactory.newInstance();

它默认会被会滚到

com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl,

同样是Apache的Xerces的实现。

 

但是,要注意的是,JDK自己实现了StAX的实习方式,StAX和SAX的区别:

SAX也是基于事件处理xml文档,但却是用推模式解析,解析器解析完整个xml文档后,才产生解析事件,然后推给程序去处理这些事件。SAX中解析器是工作主体,而事件处理器是由解析器驱动的,如果解析文档过程中产生问题,则剩余的所有文档就无法处理。

StAX使用拉模式,解析器首先将XML文档所有的事件全部取出,然后通过处理程序处理这些事件。StAX中处理器是工作主体,如果解析文档过程中产生问题,只会影响到出问题的部分,其余部分处理不受影响。

创建XMLInputFactory

XMLInputFactory factory = XMLInputFactory.newInstance();    

它的实现类是JDK自己的com.sun.xml.internal.stream.XMLInputFactoryImpl

 

3. JDom & Dom4j

W3C的DOM标准API难用的让人想撞墙,于是有一帮人开发Java专用的XML API目的是为了便于使用,这就是JDom的由来,开发到一半的时候,另一部分人又分了出来,他们有自己的想法,于是他们就去开发Dom4j,形成了今天这样两个API,至于他们之间的性能,JDom全面惨败,Dom4j大获全胜。

 

JDOM、DOM4J相当于上面的JAXP接口+DOM实现部分,它本身没有解析器,它可以使用Xerces或者Crimson的解析器。

 

jdom应用程序 -> jdom API -> Xerces/Crimson解析器

dom4j应用程序 -> dom4j API -> Xerces/Crimson解析器

dom4j应用程序 -> dom4j API -> Alfred2解析器

 

4. xerces解释器

 

在Apache xerces中对jaxp中定义的SAXParser、SAXParserFactory、DocumentBuilder、DocumentBuilderFactory进行了继承,对应SAXParserImpl、SAXParserFactoryImpl、DocumentBuilderImpl、DocumentBuilderFactoryImpl

这就是为什么你的classpath中只要有xerces.jar(其中包含了sax dom jaxp )和 xercesImpl.jar就可以的原因了.

 

5. Apache Crimson

前身是Sun Project X Parser, 至今Apache Crimson的很多代码都是从X Parser中直接移植过来的。早期的JAXP是和X Parser捆绑在一起的。后来的 JAXP和Apache Crimson捆绑在一起,比如JAXP 1.1。最新的JAXP 1.2 EA(Early Access)改弦更张,采用性能更好的Apache Xalan和Apache Xerces分别作为XSLT处理器和XML解析器,不能直接支持Apache Crimson了,因为其Apache Crimson效率低下

 

6. Xalan

是一个XSLT处理器。JAXP的XSLT引擎(Transformer类)来输出XML文档,这种方法也许是标准的方法 了,使用起来十分灵活,特别是可以自如控制输出格式,是将来创建/更新XML的主流方法

 

7. DOM是W3C的官方标准, 而SAX非W3C官方标准,是民间事实标准,一种社区性质的讨论产物。 

(1). DOM将整个XML文档载入到内存中处理,DOM以一个分层的对象模型来映射xml文档:在内存中创建DOM树,生成DOM树上的每个Node对象。

(2). SAX则相反,它将文档中的元素转化为对象来处理,可以检测一个即将到来的 XML流,由此并不需要所有的XML代码同时载入到内存中。

 

8. XSL: XML Stylesheet Language

 

9. XSLT: XML Stylesheet Language Transformations

分享到:
评论

相关推荐

    java解析xml的四种经典方法

    Java解析XML的四种经典方法是XML处理中常用的技术,它们分别是DOM、SAX、StAX和JDOM。每种方法都有其独特的特性和适用场景,下面将详细介绍这四种方法。 1. DOM(Document Object Model)解析: DOM是W3C制定的一种...

    Dom4j+Dom的jar包

    DOM4J是Java社区的一个开源项目,它提供了一个灵活且功能强大的DOM、SAX和StAX API的扩展。相比标准的DOM,DOM4J有以下优势: 1. **简洁的API**:DOM4J的API设计得更加直观和易用,使得代码更简洁,降低了学习曲线。...

    dom4j2.1.1.jar

    DOM4J2.1.1是DOM4J的一个稳定版本,它基于Java语言,支持多种XML解析器,如JAXP、SAX和StAX。这个版本修复了先前版本的一些已知问题,并引入了新的特性和性能优化,使得处理XML文档更加高效。DOM4J的设计目标是提供...

    dom4j解析XML的两个JAR包(dom4j-1.6.1.jar 和 jaxen.jar)

    2. **SAX和StAX支持**:除了DOM,DOM4J还支持事件驱动的SAX和流式的StAX解析模型,这些模型在处理大型XML文件时特别有用,因为它们不需要将整个文档加载到内存中。 3. **XPath支持**:DOM4J内置了XPath支持,这使得...

    Java中四种XML解析技术

    在Java中,有四种主要的XML解析技术,它们分别是DOM、SAX、StAX和JAXB。本文将重点讨论DOM解析器,并通过一个简单的测试来比较不同大小XML文件的处理性能。 1. DOM(Document Object Model) DOM是一种W3C推荐的...

    dom4j-1.6jar

    这个API定义了处理XML文档的一系列接口和类,如DOM、SAX和JAXP,为不同的XML解析器提供了统一的接口。 除了DOM4J本身,压缩包中还包含了一些其他相关的库,这些库扩展了DOM4J的功能或提供了与XML处理相关的服务。...

    MySQL驱动jar

    通过JAXP接口支持用于XML处理DOM,SAX和StAX 支持设置每个连接的客户端信息(可以查看查询的意见通过“SHOW PROCESSLIST的”一个MySQL服务器上,或通过一个公共接口,可扩展,以支持自定义持久性的信息) JDBC-4.0 ...

    dom读取xml与写入xml

    在IT行业中,DOM(Document Object Model)是一种标准的XML(eXtensible Markup ...在实际应用中,需要注意DOM解析整个XML文档会消耗较多资源,对于大型XML文件,可以考虑使用SAX或StAX等流式解析器作为替代方案。

    xml解析jar包

    6. StAX(Streaming API for XML):与DOM和SAX不同,StAX是基于流的解析器,允许开发者以迭代的方式处理XML文档,既可以向前也可以向后移动,提供了更多的灵活性。 在实际开发中,根据项目需求和性能考虑,可以...

    dom4j和xpath必备jar包

    1. **解析XML**:DOM4J支持多种解析方式,包括DOM、SAX和StAX,可以根据需求选择最合适的解析器。 2. **文档对象模型(DOM)**:DOM4J提供了DOM API的替代品,使得在Java中操作XML更加直观和高效。 3. **XPath支持**...

    xerces.jar&&crimson.jar

    Xerces支持多种XML规范,包括XML 1.0、XML 1.1、DOM、SAX(Simple API for XML)、JAXP(Java API for XML Processing)等。它的主要特点是性能优秀、稳定可靠,并且提供了丰富的错误处理机制。在Java应用程序中,...

    dom4j所需要的包和依赖包

    - StAX和SAX提供更高效的流式处理,但在复杂操作上不如DOM4J方便。 综上所述,DOM4J是一个强大而全面的XML处理库,提供的包和依赖包确保了其在各种Java项目中的兼容性和功能性。通过深入理解和使用,开发者可以...

    Java中四种XML解析技术.doc

    Java中的XML解析技术主要包括DOM(Document Object Model)、SAX(Simple API for XML)、StAX(Streaming API for XML)和Pull Parser。以下是对这四种技术的详细介绍: 1. DOM解析: DOM解析器,如JAXP中的...

    DOM4J1.6.1的jar包跟API

    3. **集成性**:DOM4J与流行的Java技术如JAXP、JDOM、SAX和StAX等有很好的兼容性,可以方便地与这些技术结合使用。 4. **XPath支持**:DOM4J内置了XPath支持,可以方便地通过XPath表达式定位XML文档中的任意节点。 5...

    java使用stax技术操作XML文档.doc

    Streaming API for XML (StAX) 是Java中处理XML的一种高效且灵活的标准,相较于DOM和SAX,它在性能和易用性上有显著优势。StAX是JSR-173的一部分,于2004年3月发布,最终被纳入JAXP 1.4,也将在Java 6中得到支持。 ...

    XML解析的三个jar包

    在Java中,有多种XML解析器,通常分为DOM(Document Object Model)、SAX(Simple API for XML)和StAX(Streaming API for XML)三种主要类型,对应的jar包是实现这些解析方式的基础。 1. DOM解析: DOM解析器将...

    dom4j---xml解析jar包

    4. **轻量级**:DOM4J的设计目标是轻便且高效,它不依赖于大型的JDK库,如JAXP,使得其可以在各种环境下游刃有余。 **DOM4J的核心组件** 1. **Element**:表示XML文档中的元素,可以包含其他元素、属性和文本。 2....

    java Dom教程PDF版

    但对于大型XML,由于内存消耗大,可能需要考虑其他解析策略,如SAX(Simple API for XML)或StAX(Streaming API for XML)。 8. **错误处理**:在处理XML时,必须考虑到语法错误和异常处理。DOM解析器会抛出异常,...

Global site tag (gtag.js) - Google Analytics