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 来完成这个任务!

转载于:https://www.cnblogs.com/kevinge/archive/2010/11/22/1883846.html

SAX与DOM之间的区别 转帖相关推荐

  1. JS对象与Dom对象与jQuery对象之间的区别

    前言 通过问题看本质: 举例: js的写法:document.getElementById('save').disabled=true; 在jquery中我是这样写的 $("#save&qu ...

  2. [转]ExtJs基础--Html DOM、Ext Element及Component三者之间的区别

    要学习及应用好Ext框架,必须需要理解Html DOM.Ext Element及Component三者之间的区别. 每一个HTML页面都有一个层次分明的DOM树模型,浏览器中的所有内容都有相应的DOM ...

  3. 定义指令时“控制器”,“链接”和“编译”函数之间的区别

    本文翻译自:Difference between the 'controller', 'link' and 'compile' functions when defining a directive ...

  4. .on(#39;click#39;)与.click()之间的区别

    以下代码之间有什么区别? $('#whatever').on('click', function() {/* your code here */ }); 和 $('#whatever').click( ...

  5. 了解jQuery并掌握jQuery对象和DOM对象的区别

    jQuery的优势: 开源--开放源代码 轻量级 强大的选择器 出色的DOM操作(对DOM元素的一个增删改查) 完善的Ajax,出色的浏览器兼容性,丰富的插件支持,完善的文档(说明书) 链式操作方式, ...

  6. Vue中computed、methods和watch之间的区别

    对于那些开始学习Vue的人来说,对于方法.计算属性和观察者之间的区别有点混淆. 尽管通常可以使用它们中的每一个来完成或多或少相同的事情,但了解每个人在哪里胜过其他人还是很重要的. 在这个快速提示中,我 ...

  7. Java解析xml的主要解析器: SAX和DOM的选择(附上新方法--Pull解析)

    Java的xml解析器库有很多,总的来说,万变不离其宗的就是SAX和DOM解析器. SAX的包是org.xml.sax DOM的包是org.w3c.dom 1) DOM DOM 是用与平台和语言无关的 ...

  8. CSS 中px、em、rem、%、vw、vh单位之间的区别详解【全网最全】

    一.px(像素) [绝对单位,页面按精确像素展示] px就是pixel(像素)的缩写,相对长度单位,相对于屏幕分辨率. px表示像素 (计算机屏幕上的一个点:1px = 1/96in),是绝对单位,不 ...

  9. Jquery中.val()与.value之间的区别

    三年多没敲过代码了,今年打算捡起来,是需要多么大的勇气.但是为了实现自我价值,履行自我的承诺,这就是责任.没有什么难不难,晚不晚之说,是我经常对别人说的那样,再晚不过心晚,,一切努力了,实现了每一天的 ...

最新文章

  1. mogileFS 分布式存储-安装手记
  2. 第二阶段团队项目冲刺站立会议(九)
  3. 【深度学习】何恺明经典之作—2009 CVPR Best Paper | Dark Channel Prior
  4. Docker进阶-资源管理Swarm+Portainer
  5. Visual Studio的奇淫技巧,你知道多少?
  6. 三个彩灯循环点亮程序_近百组彩灯点亮江畔,义渡灯会正式亮灯啦
  7. HDU 5730——Shell Necklace
  8. java中按钮的接口_Java接口基础
  9. java xmpp即时通讯_基于XMPP协议即时通讯工具开发总结
  10. python语言是 创造的_1.python简介
  11. Android 不同布局类型measure、layout、draw耗时对比
  12. java velocity js_JavaScript 模板引擎 Velocity.js_js
  13. 白话windows之四 异常处理机制(VEH、SEH、TopLevelEH...)
  14. python数星星问题
  15. IceSword 1.12
  16. vue 项目中使用 评论功能 带emoji表情包
  17. uni-app登陆成功跳转到首页后禁止回退到登陆页面
  18. [C++]char转换为string ,固定长度的char数组转换为string
  19. 员工半夜被微信告知公司解散| 工资未发、押金未退,共享宝马走向破产…
  20. 人才召集丨美团信息安全部 “职 ”等你来

热门文章

  1. Wannafly挑战赛27: E. 黄魔法师(构造)
  2. Educational Codeforces Round 53: E. Segment Sum(数位DP)
  3. bzoj 4653: [Noi2016]区间(尺取+线段树)
  4. opencv 图像融合
  5. 全文搜索引擎 Elasticsearch 入门(ik,kibana,x-pack)
  6. python基础系列教程——python面向对象编程全解
  7. 【Proteus仿真8086实验一】RAM存储器62256
  8. zynq开发系列3:GPIO连接MIO通过按键控制LED灯亮起
  9. 贺利坚老师汇编课程41笔记:寻址方式的综合应用修改姚明信息的例题
  10. react-navigation createBottomTabNavigator 刷新问题