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能够完成您所需要的所有功能,而且速度满足您的需要,它可以简化您的编码工作。



【浏览器渲染原理】解析和DOM树构建之HTML解析器

HTML解析器的任务是将HTML标记解析成解析树。 HTML的词汇和语法在W3C规范中进行了定义。 HTML的定义采用了DTD(DocumentType Definition,文档类型定义)。 解析树...
  • greenqingqingws
  • greenqingqingws
  • 2014年02月13日 15:48
  • 6041

dom、sax、pull解析的优缺点

一、dom解析: 将整个xml文件装载到内存中,如果内存不足就挂掉,小文件dom比较占优势。 使用场合:一旦解析了文档还需多次访问这些数据;硬件资源充足(内存、CPU)。  二、sax解析:...
  • u013470176
  • u013470176
  • 2015年12月15日 10:23
  • 1419

【网络爬虫】使用jsoup对dom树解析

基于jsoup的二次封装,对dom树解析。
  • tsj11514oo
  • tsj11514oo
  • 2017年04月30日 17:30
  • 459

python解析页面DOM树形成xpath列表,并计算DOM树的最大深度

最近对python的解析HTML的能力叹为观止,毕竟python这样强大的工具根本不缺乏解析html和xml的第三方库,我使用的是lxml当然还有其他比较好使的如:HTMLParser、Beautif...
  • Together_CZ
  • Together_CZ
  • 2017年06月25日 16:14
  • 837

DOM&SAX优缺点对比

DOM(文档对象模型),为XML文档的解析定义了一组接口,解析器读入整个文档,然后构造一个驻留内存的树结构,然后代码就可以使用DOM接口来操组整个树结构,其他点如下: 优点:整个文档树都在内存当...
  • hemeng2009
  • hemeng2009
  • 2014年10月15日 16:26
  • 589

DOM树知识点梳理

为什么会提到Dom树呢,或许它对于我们很好地理解网页各个元素,标签和控件搭配,以及各种js,css等的加载会有一些帮助。笔者在工程中遇到了一些小问题,本质就是dom树的东西掌握的不扎实。所以借此来梳理...
  • ouyangyanlan
  • ouyangyanlan
  • 2015年12月08日 12:25
  • 6614

python实现对解析之后的DOM进行层次化处理升序输出

最近在着手做html的相关处理工作,因为前期的想法偏差,使用滑窗机制得到的签名居然和网页文本得到的签名是一模一样的,我调试了很多次都是这样,最终只好暂时搁浅,不明白是哪里出了问题,现在的做法是回归HT...
  • Together_CZ
  • Together_CZ
  • 2017年06月15日 10:05
  • 334

JS基础——DOM树结构

横向凹入构造树结构 parentNode                childNodes[0]     SUCH I AM ALSO A parentNode ...
  • u014163189
  • u014163189
  • 2016年12月28日 19:06
  • 766

bzoj2780 广义后缀自动机+parent树+Dfs序+树状数组

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2780 大意:给n个串,再给m个询问,询问一个字符串是出现在哪几个母串中。 bzoj2754...
  • rainbow979
  • rainbow979
  • 2016年01月02日 17:18
  • 681

Webkit之理解HTML解析和DOM树

## 概述 前面介绍了很多眼花缭乱的新技术,关于渲染,关于硬件加速,关于布局,关于其他很多,同大家一样,我也花了很多时间来消化它们。本章介绍稍微基础些的话题(本系列的写作顺序完全是随心所欲地),...
  • sauphy
  • sauphy
  • 2015年11月19日 01:34
  • 1206
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:DOM以及广义的基于树的处理具有几个优点
举报原因:
原因补充:

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