DOM以及广义的基于树的处理具有几个优点

原创 2012年03月27日 09:30:38

首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。它还可以在任何时候在树中上下导航,而不是像SAX那样是一次性的处理。DOM使用起来也要简单得多。

另一方面,在内存中构造这样的树涉及大量的开销。大型文件完全占用系统内存容量的情况并不鲜见。此外,创建一棵DOM树可能是一个缓慢的过程。为了满足该缺点,我们使用SAX(Simple API for XML)API处理XML文档内容。它的设计目标是占用更少的内存,把更多的工作交给程序员。SAX和DOM是互补的,有各自的适用环境。请看下图解析过程:

当使用SAX解析器解析一个XML文档时,解析器在读取文档的过程中会生成一系列的事件。至于如何处理这些事件则取决于您的需求。下面列出了一小部分您在XML文档时可能遇到的事件:

n startDocument事件

n 对于每个元素,在元素开始时有startElement事件,元素结束时有endElement事件

n 如果元素包含内容,对于文本将出现characters事件,对于子元素将出现startElement和endElement事件,依此类推

n endDocument事件

如下代码及过程:

<?xml version="1.0" encoding="UTF-8"?>
<student>
	<name>goudan</name>
	<age>28</age>
</student>

分析这个代码片段的SAX处理器,一般情况下将产生以下事件:

startDocument

startElement (person)

characters (white space)

startElement (name)

characters (goudan)

endElement (name)

characters (white space)

startElement (age)

characters (28)

endElement (age)

characters (white space)

endElement (person)

endDocument

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

另一方面,由于应用程序没有以任何方式存储数据,使用SAX来更改数据或在数据流中往后移是不可能的。尽管SAX和DOM提供了许多有用的功能,对于程序员而言有些任务还是太复杂了。延续开源社群有需要就创建工具的历史传统,Java技术专家Jason Hunter 和Brett McLaughlin缔造了JDOM,这个Java库极大简化了XML文档的处理。和DOM类似,JDOM也提供一个对象树表示XML文档,但是这些对象工作的方式对Java程序员更直观。要记住,JDOM在背后包含使用普通SAX或DOM 解析器的适配器; JDOM对所有主要的(和几个次要的)Java XML解析器都提供了适配器,因此不必担心您的Java XML解析器是否支持JDOM,JDOM在幕后使用的解析器不需要您的干涉。

一般来说以下情况应使用DOM解析器:

n 需要详细了解文档的结构

n 需要改变文档的结构(也许您需要对元素排序,增加新的元素等等)

n 需要多次引用解析的信息

进一步推广,在以下情况中应使用SAX解析器:

n 内存少

n 只需要XML文档中少量元素或属性

n 解析的信息只使用一次

JDOM的内存使用比DOM少,但是不如SAX好。此外,如果您希望进行验证,JDOM要求您设置底层的解析器,JDOM本身不进行验证。就是说,如果JDOM能够完成您所需要的所有功能,而且速度满足您的需要,它可以简化您的编码工作。



相关文章推荐

web service系列二(几个广义的web service实现).md

前言关于web service的初步理解,我已经发表在《web service系列一(什么是web service).md》上了,感兴趣的可以自行查看, 本文主要是基于网易云课堂的《Web Serv...

自动化测试的几个优点和必要代价

自动化测试的几个优点和必要代价 来自: 豌豆 2011-11-27 12:28:00 自动化测试的几个突出优点:  1.执行快:覆盖用例的周期短。至少是可...

我写的几个dom4j的入门例子.rar

  • 2008年09月09日 22:49
  • 8KB
  • 下载

JS_里操作_DOM_的几个标准属性与方法

// 记录下 JS 操作 DOM 的几个标准属性与方法, // 关于 DOM ,一般可以把它看作一颗树来理解,因为是树,所以每个结点 // 会有唯一 一个父结点 (parentNode),当然除了...

将HTML DOM中几个容易常用的属性做下记录

nodeName、nodeValue 以及 nodeType 包含有关于节点的信息。 nodeName 属性含有某个节点的名称。  元素节点的 nodeName 是标签名称  属性节点的...
  • yy243
  • yy243
  • 2016年07月22日 21:51
  • 186

使用phantomjs操作DOM并对页面进行截图需要注意的几个问题

phantomjs是一个无界面浏览器,可用于网页截图和前端自动化测试,基于webkit内核(也就是chrome使用的内核),并使用js编写业务脚本来请求、浏览和操作页面。最近前端监控需要用到phant...
  • jearmy
  • jearmy
  • 2016年10月17日 11:47
  • 313

Java DOM解析XML的几个例子

Sample1: 1:新建XML文档 books.xml,放到项目的根目录下。 xml version="1.0" encoding="GB2312"?>    books  count="3" ...

原生JS实现几个常用DOM操作API

原生JS实现一些常用的API
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:DOM以及广义的基于树的处理具有几个优点
举报原因:
原因补充:

(最多只允许输入30个字)