2、jaxp是apiQ他装了sax\dom两种接口。ƈ在sax\dom的基之上Q作了一套比较简单的api以供开发h员用?br />
jaxp的包是javax.xml.parsers
可以看看jaxp的源文gQ它的文件中包含了对sax或者dom的引用(importQ?br />
jaxp也不是具体的实现Q他只是一套api。如果你仅仅有jaxp那是无法工作?br />
Q其实jaxp只是完成对sax、dom的包装,生成了DocumentBuilderFactory\DocumentBuilder
和SAXParserFactory SAXParser。也是设计模式中的工厂模式Q他的好处就是具体的对象Q?解释器)建立由子cd成)
3、xerces解释器(L(fng)地球上最快的xml解释器)
在xerces中对jaxp中定义的SAXParser SAXParserFactory DocumentBuilder DocumentBuilderFactoryq行了承(extendsQ对应SAXParserImpl SAXParserFactoryImpl DocumentBuilderImpl DocumentBuilderFactoryImpl
q就是ؓ什么你的classpath中只要有xerces.jarQ其中包含了sax dom jaxp Q和 xercesImpl.jar可以的原因?
4、什么时候可以用别的解释?比如crimson?br /> 他也是和xerces一?是解释器Q很单,用crimson.jar 替代xercesImpl.jar
5、jdom和dom4j
W3C的DOM标准API隄的让人想撞墙Q于是有一帮h开发Java专用的XML API目的是ؓ了便于用,q就是jdom的由来,开发到一半的时候,另一部分人又分了出来Q他们有自己的想法,于是他们去开发dom4jQŞ成了今天q样两个APIQ至于他们之间的性能Qjdom全面惨|Qdom4j大获全胜。我觉得jdom和dom4jq当于sax/dom+jaxpQ具体的解释器可以选择?/p>
W二Q再介绍一下,dom,sax,jdom,dom4j的技术特点:
1: DOM
DOM 是用与^台和语言无关的方式表C?XML 文档的官?W3C 标准。DOM 是以层次l构l织的节Ҏ(gu)信息片断的集合。这个层ơ结构允许开发h员在?wi)中L特定信息。分析该l构通常需要加载整个文和构造层ơ结构,然后才能做Q何工作。由于它是基于信息层ơ的Q因?DOM 被认为是Z?wi)或Z对象的。DOM 以及q义的基于树(wi)的处理具有几个优炏V首先,׃?wi)在内存中是持久的,因此可以修改它以便应用程序能?gu)据和l构作出更改。它q可以在M时候在?wi)中上下DQ而不是像 SAX 那样是一ơ性的处理。DOM 使用h也要单得多?br />
另一斚wQ对于特别大的文,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这L(fng)数据会更好。这些基于事件的模型Q比?SAX?/p>
2:SAX
q种处理的优炚w常类g媒体的优点。分析能够立卛_始,而不是等待所有的数据被处理。而且Q由于应用程序只是在d数据时检查数据,因此不需要将数据存储在内存中。这对于大型文来说是个巨大的优炏V事实上Q应用程序甚至不必解析整个文;它可以在某个条g得到满时停止解析。一般来_SAX q比它的替代?DOM 快许多?/p>
3: 选择 DOM q是选择 SAX Q?br />
对于需要自q写代码来处理 XML 文的开发h员来_选择 DOM q是 SAX 解析模型是一个非帔R要的设计决策?
DOM 采用建立?wi)Şl构的方式访?XML 文Q?SAX 采用的事件模型?
DOM 解析器把 XML 文转化Z个包含其内容的树(wi)Qƈ可以Ҏ(gu)(wi)q行遍历。用 DOM 解析模型的优Ҏ(gu)~程Ҏ(gu)Q开发h员只需要调用徏?wi)的指oQ然后利用navigation APIs讉K所需的树(wi)节点来完成Q务。可以很Ҏ(gu)的添加和修改?wi)中的元素。然而由于?DOM 解析器的时候需要处理整?XML 文Q所以对性能和内存的要求比较高,其是遇到很大的 XML 文g的时候。由于它的遍历能力,DOM 解析器常用于 XML 文需要频J的改变的服务中?
SAX 解析器采用了Z事g的模型,它在解析 XML 文的时候可以触发一pd的事Ӟ当发现给定的tag的时候,它可以激zM个回调方法,告诉该方法制定的标签已经扑ֈ。SAX 对内存的要求通常会比较低Q因为它让开发h员自己来军_所要处理的tag。特别是当开发h员只需要处理文中所包含的部分数据时QSAX q种扩展能力得到了更好的体现。但?SAX 解析器的时候编码工作会比较困难Q而且很难同时讉K同一个文中的多处不同数据?
4:jdom http://www.jdom.org
JDOM 的目的是成ؓ Java 特定文档模型Q它化与 XML 的交互ƈ且比使用 DOM 实现更快。由于是W一?Java 特定模型QJDOM 一直得到大力推q和促进。正在考虑通过“Java 规范h JSR-102”它最l用?#8220;Java 标准扩展”。从 2000 q初已l开始了 JDOM 开发?br />
JDOM ?DOM 主要有两斚w不同。首先,JDOM 仅用具体类而不使用接口。这在某些方面简化了 APIQ但是也限制了灵zL。第二,API 大量使用?Collections c,化了那些已经熟?zhn)q些cȝ Java 开发者的使用?br />
JDOM 文声明其目的是“使用 20%Q或更少Q的_֊解决 80%Q或更多QJava/XML 问题”Q根据学?fn)曲U假定ؓ 20%Q。JDOM 对于大多?Java/XML 应用E序来说当然是有用的Qƈ且大多数开发者发?API ?DOM Ҏ(gu)理解得多。JDOM q包括对E序行ؓ的相当广泛检查以防止用户做Q何在 XML 中无意义的事。然而,它仍需要?zhn)充分理?XML 以便做一些超出基本的工作Q或者甚至理解某些情况下的错误)。这也许是比学习(fn) DOM ?JDOM 接口都更有意义的工作?br />
JDOM 自n不包含解析器。它通常使用 SAX2 解析器来解析和验证输?XML 文Q尽它q可以将以前构造的 DOM 表示作ؓ输入Q。它包含一些{换器以将 JDOM 表示输出?SAX2 事g、DOM 模型?XML 文本文。JDOM 是在 Apache 许可证变体下发布的开放源码?/p>
5: DOM4J http://dom4j.sourceforge.net/
虽然 DOM4J 代表了完全独立的开发结果,但最初,它是 JDOM 的一U智能分支。它合ƈ了许多超出基?XML 文表示的功能,包括集成?XPath 支持、XML Schema 支持以及用于大文或化文的基于事件的处理。它q提供了构徏文表示的选项Q它通过 DOM4J API 和标?DOM 接口hq行讉K功能。从 2000 下半q开始,它就一直处于开发之中?br />
为支持所有这些功能,DOM4J 使用接口和抽象基本类Ҏ(gu)。DOM4J 大量使用?API 中的 Collections c,但是在许多情况下Q它q提供一些替代方法以允许更好的性能或更直接的编码方法。直接好处是Q虽?DOM4J 付出了更复杂?API 的代P但是它提供了?JDOM 大得多的灉|性?br />
在添加灵zL、XPath 集成和对大文处理的目标ӞDOM4J 的目标与 JDOM 是一L(fng)Q针?Java 开发者的易用性和直观操作。它q致力于成ؓ?JDOM 更完整的解决Ҏ(gu)Q实现在本质上处理所?Java/XML 问题的目标。在完成该目标时Q它?JDOM 更少防止不正的应用E序行ؓ?br />
DOM4J 是一个非帔R怼U的Java XML APIQ具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的Y件。如今你可以看到来多?Java 软g都在使用 DOM4J 来读?XMLQ特别值得一提的是连 Sun ?JAXM 也在?DOM4J?/p>
最后:我徏议用dom4j
JDOM ?DOM 在性能试时表C佻I在测?10M 文时内存溢出。在文情况下q值得考虑使用 DOM ?JDOM。虽?JDOM 的开发者已l说明他们期望在正式发行版前专注性能问题Q但是从性能观点来看Q它实没有值得推荐之处。另外,DOM 仍是一个非常好的选择。DOM 实现q泛应用于多U编E语a。它q是许多其它?XML 相关的标准的基础Q因为它正式获得 W3C 推荐Q与Z非标准的 Java 模型相对Q,所以在某些cd的项目中可能也需要它Q如?javascript 中?DOMQ?br />
SAX表现较好Q这要依赖于它特定的解析方式。一?SAX 即到来的XML,但ƈ没有载入到内存(当然当XML被dӞ会有部分文档暂时隐藏在内存中Q?br />
无疑QDOM4J是最好的Q目前许多开源项目中大量采用 DOM4JQ例如大名鼎鼎的 Hibernate 也用 DOM4J 来读?XML 配置文g。如果不考虑可移植性,那就采用DOM4J吧!