SAX,DOM,JAXP,JDOM,DOM4J是什么?
SAX、DOM是两种对XML文档进行分析的方法(没有具体的实现,只有接口)所以不是解释器,如果光有他们,你是完成不了对XML文档的处理的。SAX的包是org.xml.sax。DOM的包是org.w3c.dom,包的名称很重要,有助于你理解他们之间的关系。
JAXP是API,他封装了SAX\DOM两种接口。并在SAX\DOM的基础之上,作了一套比较简单的API以供开发人员使用。JAXP的包是javax.XML.parsers可以看看JAXP的源文件,它的文件中包含了对SAX或者DOM的引用(import)JAXP也不是具体的实现,他只是一套API。如果你仅仅有JAXP那是无法工作的(其实JAXP只是完成对SAX、DOM的包装,生成了DocumentBuilderFactory\DocumentBuilder和SAXParserFactorySAXParser。也就是设计模式中的工厂模式,他的好处就是具体的对象(解释器)建立由子类完成)
JDOM和DOM4J,W3C的DOM标准API难用的让人想撞墙,于是有一帮人开发Java专用的XMLAPI目的是为了便于使用,这就是JDOM的由来,开发到一半的时候,另一部分人又分了出来,他们有自己的想法,于是他们就去开发DOM4J,形成了今天这样两个API,至于他们之间的性能,JDOM全面惨败,DOM4J大获全胜。我觉得JDOM和DOM4J就相当于SAX/DOM+JAXP,具体的解释器可以选择。
SAX,DOM,JAXP,JDOM,DOM4J技术特点:
DOM
DOM(全称Document Object Model,文档对象模型)是以一种独立于平台和语言的方式访问和修改一个文档的内容和结构的官方W3C标准API。DOM的设计是以对象管理组织(OMG)的规约为基础的,因此可以用于任何编程语言分析器把整个XML文档以一棵树的形式放在内存中,应用程序可以随时对DOM树中的任何一个部分进行访问与操作。通过DOM树,应用程序可以随机访问。这种访问方式给程序开发带来了很大的灵活性,可以任意地控制整个XML文档中的内容。但是DOM对内存的需求比较高,并且效率也不是很理想。
优点:
丰富的API集合,可以轻松导航。
整个DOM树加载到内存,允许随机访问。
缺点:
整个XML文档必须一次解析完。
整个DOM树都加载到内存中,内存要求高。
一般的DOM节点对于必须为所有节点创建对象的对象类型绑定不太理想。
SAX
SAX(全称Simple API for XML,XML的简单应用程序接口)是一个用于处理XML事件驱动的"推"模型,虽然它不是W3C标准,但它却是一个得到了广泛认可的API。SAX解析器不像DOM那样建立一个完整的文档树,而是在读取文档时激活一系列事件,这些事件被推给事件处理器,然后由事件处理器提供对文档内容的访问。因为事件触发是有时序性的,所以SAX分析器提供的是一种对XML文档的顺序访问机制,对于已经分析过的部分,不能再重新倒回去处理。SAX分析器在实现时,只是顺序地检查XML文档中的字节流,判断当前字节是XML语法中的哪一部分,检查是否符合XML语法并且触发相应的事件。对于事件处理函数的本身,要由应用程序自己来实现。SAX的工作原理简单地说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。
优点:
与DOM相比,SAX解析器能提供更好的性能优势,它提供对XML文档内容的有效低级访问。
SAX模型最大的优点是内存消耗小,因为整个文档无需一次加载到内存中,这使SAX解析器可以解析大于系统内存的文档。
无需像在DOM中那样为所有节点创建对象。
SAX"推"模型可用于广播环境,能够同时注册多个ContentHandler,并行接收事件,而不是在一个管道中一个接一个地进行处理。
缺点:
没有内置的文档导航支持。
不能随机访问XML文档。
不支持原地修改XML。
不支持名字空间作用域。
JAXP
JAXP(全称Java API for XML Processing,用于XML文档处理的Java编程接口)是sun在以上两套API的基础上开发出来的操作XML的API。支持DOM、SAX、XSLT等标准。为了增强JAXP使用上的灵活性,开发者特别为JAXP设计了一个PluggabilityLayer,在PluggabilityLayer的支持之下,JAXP既可以和具体实现DOMAPI、SAXAPI的各种XML解析器(XMLParser,例如Apache Xerces)联合工作,又可以和具体执行XSLT标准的XSLT处理器(XSLTProcessor,例如ApacheXalan)联合工作。由于问题太多,从JDK1.7开始删除该功能。
JDOM
JDOM是处理XML的纯java API。使用具体类而不是接口。JDOM具有树的遍历,又有SAX的java规则。
JDOM的目的是成为Java特定文档模型,它简化与XML的交互并且比使用DOM实现更快。是第一个Java特定模型,JDOM得到大力推广和促进。JDOM与DOM主要有两方面不同。首先,JDOM仅使用具体类而不使用接口。这在某些方面简化了API,但是也限制了灵活性。第二,API大量使用了Collections类,简化了那些已经熟悉这些类的Java开发者的使用。JDOM对于大多数Java/XML应用程序来说当然是有用的,并且大多数开发者发现API比DOM容易理解得多。JDOM还包括对程序行为的相当广泛检查以防止用户做任何在XML中无意义的事。然而,它仍需要您充分理解XML以便做一些超出基本的工作(或者甚至理解某些情况下的错误)。这也许是比学习DOM或JDOM接口都更有意义的工作。JDOM自身不包含解析器。它通常使用SAX2解析器来解析和验证输入XML文档(尽管它还可以将以前构造的DOM表示作为输入)。它包含一些转换器以将JDOM表示输出成SAX2事件流、DOM模型或XML文本文档。JDOM是在Apache许可证变体下发布的开放源码。
优点:
是基于树的处理XML的java API,把树加载到内存中。
没有向下兼容的限制,所以比DOM简单。
速度快。
具有SAX的java规则。
缺点:
不能处理大于内存的文档。
JDOM表示XML文档逻辑模型,不能保证每个字节真正变换。
针对实例文档不提供DTD与模式的任何实际模型。
不支持于DOM中相应遍历包。
DOM4J
DOM4J是JDOM的一种智能分支。它合并了许多超出基本XML文档表示的功能,包括集成的XPath支持、XML Schema支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项,它通过DOM4J API和标准DOM接口具有并行访问功能。支持所有这些功能,DOM4J使用接口和抽象基本类方法。DOM4J大量使用了API中的Collections类,但是在许多情况下,它还提供一些替代方法以允许更好的性能或更直接的编码方法。直接好处是,虽然DOM4J付出了更复杂的API的代价,但是它提供了比JDOM大得多的灵活性。在添加灵活性、XPath集成和对大文档处理的目标时,DOM4J的目标与JDOM是一样的:针对Java开发者的易用性和直观操作。它还致力于成为比JDOM更完整的解决方案,实现在本质上处理所有Java/XML问题的目标。在完成该目标时,它比JDOM更少强调防止不正确的应用程序行为。DOM4J是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的Java软件都在使用DOM4J来读写XML,特别值得一提的是连Sun的JAXM也在用DOM4J.