`
eriol
  • 浏览: 408962 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

DOM和SAX的比较

阅读更多

1. 用于读取和操作 XML 文件的标准是文档对象模型DOM。

DOM为 XML 文档的已解析版本定义了一组接口。解析器读入整个文档,然后构建一个驻留内存的树结构,然后您的代码就可以使用 DOM 接口来操作这个树结构 。您可以遍历树以了解原始文档包含了什么,您可以删除树的几个部分,还可以重新排列树和添加新的分支,等等。
遗憾的是,因为DOM 方法涉及读取整个文件并将该文件存储在一个树结构中,而这样可能是低效的、缓慢的,并且很消耗资源:
1)DOM 构建整个文档驻留内存的树。如果文档很大,就会要求有极大的内存。
2)DOM 创建表示原始文档中每个东西的对象,包括元素、文本、属性和空格。如果您只需关注原始文档的一小部分,那么创建那些永远不被使用的对象是极其浪费的。
3)DOM 解析器必须在您的代码取得控制权之前读取整个文档。对于非常大的文档,这会引起显著的延迟。
这些仅仅是由文档对象模型的设计引起的问题;撇开这些问题,DOM API 是解析 XML 文档非常有用的方法。


2. 一种替代技术就是SAX。相比于文档对象模型DOM,SAX 是读取和操作 XML 数据的更快速、更轻量的方法。SAX 允许您在读取文档时处理它,从而不必等待整个文档被存储之后才采取操作。它不涉及 DOM 所必需的开销和概念跳跃。

SAX API是一个基于事件 的 API,适用于处理数据流,即随着数据的流动而依次处理数据。
SAX API 在其解析您的文档时发生一定事件的时候会通知您。在您对其响应时,您不作保存的数据将会被抛弃。

在 使用DOM的情况下,解析器做了绝大多数事情, 读入XML文档, 在这基础之上创建对象模型,然后给你一个对这个对象的引用(一个 Document对象),因而你可以操作使用它。SAX没有期待解析器去做这么多工作,所有SAX 要求的是解析器应该读入XML文档,同时根据所遇到的XML文档的标签向一个事件处理程序发出一系列事件,比如元素开始和元素结束,而事件处理器则处理该 信息:你要自己写一个XML文档处理器类(XML document handler class)来处理这些事件,这意味着使所有标签事件有意义还有用你自己的对象模型创建对象。所以你要完成:
1)控制所有XML文档信息的自定义对象模型。
2)一个监听SAX事件(事件由SAX解析器读取你的XML文档时产生)的文档处理器,还有解释这些事件创建你自定义对象模型中的对象。
如果你的对象模型简单的话那么SAX在运行时会非常快。在这种情况下,它会比DOM快,因为它忽略了为你的信息创建一个树形对象模型的过程。从另一方面来说,你必须写一个SAX 文档处理器来解释所有的SAX事件(这会是一件很繁重的工作)。
3)基于事件的API 消除了在内存中构造树的需要,却不允许开发人员实际更改原始文档中的数据。所以原始的文档仍然保留完好无损;但是 SAX 提供了操作数据的手段,而后数据可以引入另一个进程或文档。

[ 要使用 XML 文档做任何事情,你都必须读取其中的信息。做这个工作的应用程序称为解析器。它设计用于分析文档(这里是指 XML 文件),以及做一些特定于该信息的事情。在诸如 SAX 这样基于事件的 API 中,解析器将向某种监听器发送事件。在诸如 DOM 这样基于树的 API 中,解析器将在内存中构造一棵数据树。]

3. SAX 的几个特征解决了 DOM 的问题:

1) SAX 解析器向您的代码发送事件。当解析器发现元素开始、元素结束、文本、文档的开始或结束等时,它会告诉您。您可以决定什么事件对您重要,而且可以决定要创建什么类型的数据结构以保存来自这些事件的数据。如果您没有显式地保存来自某个事件的数据,它就被丢弃。
2) SAX 解析器根本不创建任何对象,它只是将事件传递给您的应用程序。如果希望基于那些事件创建对象,这将由您来完成。
3) SAX 解析器在解析开始的时候就开始发送事件。当解析器发现文档开始、元素开始和文本等时,代码会收到一个事件。您的应用程序可以立即开始生成结果;您不必一直 等到整个文档被解析完毕。更妙的是,如果您只查找文档中某些内容,代码一旦找到所要找的东西就可以抛出一个异常。该异常会停止 SAX 解析器,然后代码用它找到的数据做它需要做的任何事。

公平而言,SAX 解析器也有些问题引人关注:
1) DOM 所提供的丰富的标准功能在 SAX 中是没有的。
2) SAX 事件是无状态的。当 SAX 解析器在 XML 文档中发现文本时,它就向您的代码发送一个事件。该事件仅仅给您发现的文本;它不告诉您什么元素包含那个文本。如果您想知道这一点,则必须自己编写状态管理代码。
3) SAX 事件不是持久的。如果应用程序需要一个数据结构来对 XML 文档建模,则必须自己编写那样的代码。如果您需要从 SAX 事件访问数据,并且没有把那个数据存储在代码中,那么您不得不再次解析该文档。


4. SAX 处理涉及以下步骤:
1) 创建一个事件处理程序。
2) 创建 SAX 解析器。
3) 向解析器分配事件处理程序。
4) 解析文档,同时向事件处理程序发送每个事件。

[什 么类型的SAX事件被SAX解析器抛出了哪 这些事件实际上是非常简单的。SAX会对每一个开始标签抛出事件,对每一个结束标签也是如此。它对#PCDATA和 CDATA 部分同样抛出事件。你的文档处理器 (对这些事件的监听器)要解释这些事件同时还要在他们基础之上创建你自定义的对象模型。 你的文档处理器必须对这些事件做出解释,同时这些事件发生的顺序是非常重要的。SAX同时也对processing instructions, DTDs, comments, 抛出事件. 但是它们在概念上是一样的, 你的解析器要解释这些事件(还有这些事件的发生顺序)以及使他们有意义。]


--基于树的处理 的优点和缺点

DOM 以及广义的基于树的处理具有几个优点。
首先,由于树在内存中是持久 的,因此可以修改它以便应用程序能对数据和结构作出更改。它还可以在任何时候在树中上下导航,而不是像 SAX 那样是一次性的处理。DOM 使用起来也要简单得多。
另一方面,在内存 中构造这样的树涉及大量的开销 。大型文件完全占用系统内存容量的情况并不鲜见。此外,创建一棵 DOM 树可能是一个缓慢的过程。

--基于事件的处理 的优点和缺点

这种处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存 中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。一般来说,SAX 还比它的替代者 DOM 许多。
另一方面,由于应用程序没有以任何方式存储数据,使用 SAX 来更改数据或在数据流中往后移是不可能的。

分享到:
评论

相关推荐

    DOM和SAX比较和选择

    ### DOM与SAX比较及选择 #### 一、概述 在处理XML文档时,开发者面临着多种解析技术的选择,包括DOM(Document Object Model)、SAX(Simple API for XML)、JDOM等。其中,DOM和SAX是最常用且重要的两种方式。...

    dom解析和sax解析

    DOM(Document Object Model)解析和SAX(Simple API for XML)解析是两种常见的XML文档解析方式,它们在处理XML数据时有不同的策略和优缺点。 DOM解析是一种基于树型结构的XML解析方法。当一个XML文档被DOM解析器...

    xml_DOM_SAX.rar_DOM_dom xml saxxml_java dom_sax

    在Java中,处理XML文件主要有两种解析器:DOM(Document Object Model)和SAX(Simple API for XML)。这两种解析方式各有特点,适用于不同的场景。 1. DOM解析: DOM解析器将整个XML文档加载到内存中,构建一个树...

    dom和sax对xml的解析

    在Java中,有多种方式可以解析XML文档,其中最常用的是DOM(Document Object Model)和SAX(Simple API for XML)。本篇文章将详细介绍DOM和SAX解析XML的方法,并通过提供的`DomDemo.java`和`SaxDemo.java`示例代码...

    DOM和SAX概念的总结

    【DOM和SAX概念的总结】 在XML处理中,有两个主要的解析模型:基于对象的DOM(Document Object Model)和基于事件的SAX(Simple API for XML)。它们都是用来解析和操作XML文档的API,但各有特点和适用场景。 DOM...

    DOM和SAX解析XML文档

    DOM与SAX的比较: 1. 性能:SAX通常比DOM更快,因为它不加载整个文档到内存,而DOM需要较大的内存开销。 2. 灵活性:DOM提供更灵活的访问,可以随时修改任何元素,而SAX只能按顺序处理,不支持随机访问。 3. 处理...

    dom jdom sax dom4j 原理性能比

    本篇文章将探讨四种处理XML的Java库:DOM、JDOM、SAX和DOM4J,分析它们的原理、性能特点以及适用场景。 首先,我们来了解DOM(Document Object Model)。DOM是W3C组织定义的一种API,它将XML文档解析为一个树形结构...

    XML的四种解析器(dom,sax,jdom,dom4j)原理及性能比较,超详细

    常见的 XML 解析器有 DOM、SAX、JDOM 和 DOM4J 等。每种解析器都有其特点和优缺,选择合适的解析器对应用程序的性能和开发效率有很大影响。 1. DOM 解析器 DOM(Document Object Model)是 W3C 官方标准,用于表示...

    jdom,dom,sax架包

    Java XML处理技术是Java开发中不可或缺的一部分,主要包含三种主流的API:JDOM、DOM和SAX。这些库被广泛用于解析、创建和操作XML文档,各有其特点和适用场景。 1. JDOM(Java DOM): JDOM是Java特定的DOM实现,它...

    java中四种操作(dom、sax、jdom、dom4j)xml方式详解与比较.txt )

    java中四种操作(dom、sax、jdom、dom4j)xml方式详解与

    dom.sax.pull解析

    Ø 1、DOM(org.w3c.dom) Ø “文档对象模型”方式,解析完的Xml将生成一个树状结构的对象。 Ø 2、SAX(org.xml.sax) Ø SimpleAPI for XML,以事件的形式通知程序,对Xml进行解析。 Ø 3、XMLPULL(org.xmlpull.v1) ...

    XML_DOM_SAX.rar_ XML_DOM_SAX_c# sax_dom解析xml_xml parser csharp_x

    在C#中处理XML时,有两种主要的解析方法:DOM(Document Object Model)和SAX(Simple API for XML)。 1. DOM解析: DOM是一种将整个XML文档加载到内存中的解析方式,它构建了一个树形结构来表示XML文档,允许...

    SAX与DOM之间的区别

    - 在一些复杂的应用场景中,可能需要同时使用DOM和SAX来处理同一个文档的不同部分。 - 例如,使用DOM来修改文档中的某些部分,然后使用SAX来处理经过修改后的文档,从而达到优化性能的目的。 #### 六、结论 选择...

    jsp操作xml源码,解析器为DOM和SAX

    在本案例中,“jsp操作xml源码,解析器为DOM和SAX”是关于如何在JSP中读取和处理XML文件的一种实践。 首先,我们要介绍两种主要的XML解析器:DOM(Document Object Model)和SAX(Simple API for XML)。 1. DOM...

    dom和sax读XML源码范例

    处理XML文件时,我们通常会使用两种主要的方法:DOM(Document Object Model)和SAX(Simple API for XML)。本文将深入探讨这两种解析方式,并通过代码示例来阐述它们的工作原理。 DOM解析是将整个XML文档加载到...

    Java解析XML文件的DOM和SAX方式.doc

    Java 解析 XML 文件的 DOM 和 SAX 方式 Java 解析 XML 文件的 DOM 和 SAX 方式是指在 Java 中使用 Document Object Model(DOM)和 Simple API for XML(SAX)两种方式来解析 XML 文件的技术。下面将详细介绍这两种...

    用DOM SAX JDom dom4j 对xml文档解析实例

    dom4j是一个非常灵活的Java XML API,它结合了DOM、SAX和JDom的优点。dom4j支持DOM和SAX解析,同时提供了强大的查询功能,如XPath和XML Schema验证。它的API设计简洁,易于使用,适合各种XML处理需求。 在实际应用...

    DOM与SAX入门

    DOM与SAX入门,适合初学者,理解DOM与SAX,进而web前端开发。

    XML文件c语言 dom和sax模式解析

    在C语言环境中,处理XML文件时,通常有两种主要的解析模式:DOM(Document Object Model)和SAX(Simple API for XML)。 **DOM解析模式**: DOM解析器将整个XML文档加载到内存中,创建一个树形结构,即文档对象...

Global site tag (gtag.js) - Google Analytics