转发,原文地址:http://blog.csdn.net/shixuehuiab/article/details/3979273
SAX (Simple API for XML) 和 DOM (Document Object Model) 是当前两个主要的XML API,几乎所有商用的xml 解析器都同时实现了这两个接口。因此如果你的程序使用了SAX或者DOM APIs,那么你的程序对xml解析器是透明。
1. DOM以一个分层的对象模型来映射xml文档。而SAX将文档中的元素转化为对象来处理。
2. DOM将文档载入到内存中处理,而SAX则相反,它可以检测一个即将到来的 XML流,由此并不需要所有的XML代码同时载入到内存中。
SAX 处理是如何工作的
SAX 在读取 XML 流的同时处理它们,这很像以前的自动收报机纸带(ticker tape)。请考虑下面的 XML 代码片断:
<?xml version="1.0"?>
<samples>
<server>UNIX</server>
<monitor>color</monitor>
</samples>
分析这个代码片断的 SAX 处理器一般情况下将产生以下事件:
Start document
Start element (samples)
Characters (white space)
Start element (server)
Characters (UNIX)
End element (server)
Characters (white space)
Start element (monitor)
Characters (color)
End element (monitor)
Characters (white space)
End element (samples)
SAX API 允许开发人员捕捉这些事件并对它们作出反应。
SAX 处理涉及以下步骤:
1.创建一个事件处理程序。
2.创建 SAX 解析器。
3.向解析器分配事件处理程序。
4.解析文档,同时向事件处理程序发送每个事件。
基于事件的处理的优点和缺点
这种处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。一般来说,SAX 还比它的替代者 DOM 快许多。
另一方面,由于应用程序没有以任何方式存储数据,使用 SAX 来更改数据或在数据流中往后移是不可能的。
DOM 和基于树的处理
DOM 是处理 XML 数据的传统方法。使用 DOM 时,数据以树状结构的形式被加载到内存中。
例如,在“SAX 处理是如何工作的”中用作例子的相同文档在 DOM 中将表示为节点,DOM 使用父子关系。
基于树的处理的优点和缺点
DOM 以及广义的基于树的处理具有几个优点。首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。它还可以在任何时候在树中上下导航,而不是像 SAX 那样是一次性的处理。DOM 使用起来也要简单得多。
另一方面,在内存中构造这样的树涉及大量的开销。大型文件完全占用系统内存容量的情况并不鲜见。此外,创建一棵 DOM 树可能是一个缓慢的过程。
如何在 SAX 和 DOM 之间选择
选择 DOM 还是选择 SAX,这取决于下面几个因素:
1.应用程序的目的:如果打算对数据作出更改并将它输出为 XML,那么在大多数情况下,DOM 是适当的选择。并不是说使用 SAX 就不能更改数据,但是该过程要复杂得多,因为您必须对数据的一份拷贝而不是对数据本身作出更改。
2.数据容量: 对于大型文件,SAX 是更好的选择。
数据将如何使用:如果只有数据中的少量部分会被使用,那么使用 SAX 来将该部分数据提取到应用程序中可能更好。 另一方面,如果您知道自己以后会回头引用已处理过的大量信息,那么 SAX 也许不是恰当的选择。
3.对速度的需要: SAX 实现通常要比 DOM 实现更快。
SAX 和 DOM 不是相互排斥的,记住这点很重要。您可以使用 DOM 来创建 SAX 事件流,也可以使用 SAX 来创建 DOM 树。事实上,用于创建 DOM 树的大多数解析器实际上都使用 SAX 来完成这个任务!
分享到:
相关推荐
本篇文章将探讨四种处理XML的Java库:DOM、JDOM、SAX和DOM4J,分析它们的原理、性能特点以及适用场景。 首先,我们来了解DOM(Document Object Model)。DOM是W3C组织定义的一种API,它将XML文档解析为一个树形结构...
JDOM在性能上介于SAX和DOM之间,内存占用比DOM少,但比SAX多。它的优势在于简化了XML处理,特别是对于Java开发者来说,代码可读性和可维护性更高。 在实际应用中,选择哪种解析方式取决于具体需求。如果需要高效...
StAX是Java提供的一个流式解析API,它介于DOM和SAX之间。像SAX一样,StAX也是事件驱动的,但它允许程序员以拉式(pull)的方式控制解析过程,这样可以在需要时获取数据,减少了内存消耗。StAX在生成XML字符串时,...
为了处理XML文档,Java提供了多种解析方法,包括SAX(Simple API for XML)、JDOM(Java Document Object Model)、DOM(Document Object Model)以及stAX(Streaming API for XML)。下面将详细介绍这四种解析XML的...
总结起来,VTD-XML是介于SAX和DOM之间的一个折衷方案,它在保持低内存占用的同时,提供了XPath支持和更高的性能,对于那些需要高效解析和查询XML的应用来说,VTD-XML是一个理想的选择。同时,它的跨平台性和多语言...
针对SAX、DOM和Pull解析器,我们可以设计测试用例检查解析出的学校数据是否与预期相符,例如校名、地址、学生数量等。同时,测试应覆盖异常情况,如非法XML格式或不存在的文件,以验证解析器的错误处理能力。 在...
与DOM不同,SAX是一种基于事件的解析模型。当解析器遇到文档中的特定元素时,会触发相应的事件,应用程序可以通过实现相应的事件处理器来响应这些事件。SAX的主要特点包括: - **内存效率高**:SAX解析器不会将整个...
XML(eXtensible Markup Language)是一种用于存储和传输数据的...此外,还可以考虑使用StAX(Streaming API for XML),这是一种介于DOM和SAX之间的解析方式,结合了两者的优势,既节省内存又允许有限的向前查找能力。
JDOM是Java特有的XML处理库,它提供了一个简单易用的API,介于DOM和SAX之间。JDOM将XML映射为Java对象,但比DOM更轻量级,解析速度也更快。 1. **JDOM读取XML**:使用`org.jdom2.input.SAXBuilder`解析XML,然后...
DOM解析器与JDOM类似,将整个XML文档加载到内存中形成一个树形结构,便于操作,但同样不适合处理大型XML文件。 在选择XML解析器时,需要考虑以下因素: - **性能**:如果XML文件较小,可以选择DOM或JDOM;对于大型...
与DOM不同,SAX不需要一次性加载整个XML文档,而是按需读取,逐事件处理,这使得它在处理大文件时更为高效。然而,由于其回调机制,SAX的使用相对于DOM和DOM4J来说更复杂一些。 `jaxen-1.1.1.jar` 是JAXEN(Java ...
StaX是另一种流式API,介于DOM和SAX之间。它允许程序以推送或拉取的方式处理XML流,可以减少内存使用,同时提供了随机访问能力。与SAX相比,StaX更易于使用,因为它提供了XML事件生成器,可以按需读取XML数据。 在...
本文将深入探讨XML开发中的四个关键概念:DTD(Document Type Definition)、CSS(Cascading Style Sheets)、XSLT(Extensible Stylesheet Language Transformations)以及DOM和SAX解析器。 1. DTD(Document Type...
而JDOM和DOM4J则在易用性和性能之间取得平衡,适合那些希望简化DOM操作而又不牺牲太多性能的项目。 对于XML的源码分析,可以研究这些解析器的内部实现,理解它们如何解析XML、触发事件或构建DOM树。同时,还可以...
7. **与JAXB集成**:DOM4J可以与Java Architecture for XML Binding (JAXB) 集成,方便地在XML和Java对象之间进行转换。 8. **与Spring框架集成**:在Spring框架中,DOM4J常用于配置文件的解析,例如Spring的bean...
- 如果处理的XML文档既大又不需要频繁查询,可以选择StAX(Streaming API for XML),这是一种流式解析方式,介于DOM和SAX之间,性能优于DOM,灵活性接近SAX。 4. Java XML解析库: 除了Java自带的解析库,还有第三...
与DOM不同,SAX不会将整个文档加载到内存中,而是逐个解析文档中的事件(如开始元素、结束元素等),这使得它在处理大型文件时更加高效。SAX的关键概念包括: - **解析器**:负责读取XML文档并生成事件。 - **事件...
Jaxen是一个独立的XPath引擎,它允许在多种XML API(包括DOM4J)之间统一执行XPath表达式。DOM4J虽然内置了一些XPath支持,但为了更全面的功能,它依赖Jaxen来提供更完整的XPath处理能力。 综上所述,DOM4J 1.6.1...
XMLPullParser可以视为SAX和DOM之间的折衷方案,它不需要实现`DefaultHandler`,而是直接调用一系列方法来移动解析器并处理当前事件。 总结,Android中的XML解析主要有DOM、SAX和XMLPullParser三种方式,每种都有其...