关闭

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

194人阅读 评论(0) 收藏 举报

首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。它还可以在任何时候在树中上下导航,而不是像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能够完成您所需要的所有功能,而且速度满足您的需要,它可以简化您的编码工作。



0
0

  相关文章推荐
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:129758次
    • 积分:3643
    • 等级:
    • 排名:第9287名
    • 原创:256篇
    • 转载:0篇
    • 译文:0篇
    • 评论:7条
    文章均来自以下教程网
    文章分类
    文章存档
    最新评论