SAX与DOM的区别
2016-01-08 11:58
183 查看
原文地址:/article/5158173.html
SAX与DOM
在解析xml时(如浏览器解析html标签),主要存在两种方式:SAX模式和DOM模式SAX (Simple API for XML) 和 DOM (Document Object Model) 是当前两个主要的XML
API,几乎所有商用的xml 解析器都同时实现了这两个接口。因此如果你的程序使用了SAX或者DOM
APIs,那么你的程序对xml解析器是透明。
SAX | DOM |
依序读入文件并产生相对应事件,可以处理任何大小的XML文件。 | 在内存中建立文件树,不适于处理大型的XML文件。 |
只能对文件按顺序剖析一遍,不支持对文件的随意存取 | 可以随意存取文件树的任何部分,没有次数限制 |
只能读取XML文件内容,而不能修改 | 可以随意修改文件树,从而修改了XML文件 |
开发上比较复杂,需要自己来制作事件处理器 | 易于理解,易于开发 |
对工作人员更灵活,可以用SAX建立自己的XML对象模型 | 已经在DOM基础之上建立了文件树 |
这种处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查数据,
[align=left] 因此不需 要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时[/align]
停止解析。一般来说,SAX 还比它的替代者 DOM 快许多。
另一方面,由于应用程序没有以任何方式存储数据,使用 SAX 来更改数据或在数据流中往后移是不可能的。
[align=left] [/align]
[align=left]基于树的处理的优点和缺点[/align]
DOM
以及广义的基于树的处理具有几个优点。首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。
它还可以在任何时候在树中上下导航,而不是像 SAX 那样是一次性的处理。DOM 使用起来也要简单得多。
另一方面,在内存中构造这样的树涉及大量的开销。大型文件完全占用系统内存容量的情况并不鲜见。此外,创建一棵 DOM 树可能是一个缓慢的过程。
[align=left] [/align]
如何在 SAX 和 DOM 之间选择
选择 DOM 还是选择 SAX,这取决于下面几个因素:
1.应用程序的目的:如果打算对数据作出更改并将它输出为 XML,那么在大多数情况下,DOM 是适当的选择。并不是说使用 SAX 就不能更改数据,
[align=left] 但是该过程要复杂得多,因为您必须对数据的一份拷贝而不是对数据本身作出更改。 [/align]
2.数据容量: 对于大型文件,SAX 是更好的选择。
数据将如何使用:如果只有数据中的少量部分会被使用,那么使用 SAX 来将该部分数据提取到应用程序中可能更好。 另一方面,
[align=left] 如果您知道自己以后会回头引用已处理过的大量信息,那么 SAX 也许不是恰当的选择。 [/align]
3.对速度的需要: SAX 实现通常要比 DOM 实现更快。
SAX 和 DOM 不是相互排斥的,记住这点很重要。您可以使用 DOM 来创建 SAX 事件流,也可以使用 SAX 来创建 DOM 树。事实上,用于创建 DOM 树的大多数解析器实际上都使用 SAX 来完成这个任务!
相关文章推荐
- Ogre2.1 灯光与阴影
- 解决LoadRunner请求返回中文为乱码的问题
- jquery 合并两个 json 对象
- C Primer Plus5-5
- CGContextRef CIImageRef详解
- 5-基本的sql查询以及函数的使用
- configure: error: Please reinstall the libcurl distribution - easy.h should be in <curl-dir>/include/curl/
- 关于批量插入的一点点思考和总结
- 在 artDialog 窗口中追加最大化、最小化按钮
- Unity教程之-Unity3d实现屏幕抖动效果
- C Primer Plus5-3
- C Primer Plus5-4
- 16进制字符串转36进制字符串
- 使用ClosedXML开发Office之–Excel的开发
- Java Field[] Field理解
- 简单的时间段选择控件
- javascript运动框架用法实例分析(实现放大与缩小效果)
- [1,2,3].forEach(alert);这种写法有什么利和弊吗?
- graphite安装过程中窗口无法显示
- 【转】自定义presentviewcontroller和pushviewcontroller转场动画