前面介绍了四种创建、解析XML的方式:
0、 Android 创建与解析XML(一)—— 概述
1、 Android 创建与解析XML(二)——Dom方式
2、Android 创建与解析XML(三)——Sax方式
3、Android 创建与解析XML(四)——Pull方式
4、Android 创建与解析XML(五)—— Dom4j方式其中,从处理方式看,有的采用了Java处理XML的标准方式,有的是经过第三方改进后的XML处理方式;从事件角度看,有的是基于Dom树节点,有的基于事件处理
为什么创建、解析XML会产生这么多方法呢?四种处理方式的特点各是什么?它们分别更适合什么样的使用场景呢?
一、 XML 通用标准
XML世界非常庞大,而且还在不断成长,存在大量不同的标准和技术,它们以复杂的方式互相影响。
XML 正在变得越来越强大,并且得到了迅速的发展,它已经证明自己是一种非常有价值的技术,但可能也是一种令人害怕的技术,如果考虑到挂在“XML”一词下面不断变化的各个部分,新手很难确定哪些是 XML 最重要的方面,用户也难以跟踪这个领域出现的新生事物和变化。
标准,有各种各样的形式,而且在同一个领域中常常有多种标准互相竞争,此处把标准定义为:被不同的供应商大量采用的或者有影响的、独立于供应商的组织推荐的规范。
1) XML 1.0,W3C推荐的标准,衍生出 XML 技术大树的主干。它在 Unicode [Unicode Consortium 技术报告和 ISO 标准]的基础上定义了文本格式的严格规则,以及DTD(文档类型定义,Document Type Definition)验证语言。该规范的当前版本(第 2 版)包含了规范的历次修订。它被 翻译成多种语言,尽管英语版本是唯一的规范版本,就是说只有这个版本被认为具有标准的效力。
2) XML 1.1,正在开发中,是改变了结构良好的 XML 文档的定义的第一个修订版。主要的变化是修订了 XML 规范中对字符的处理,使其更自然地适应 Unicode 规范的变化,并通过引用 万维网字符模型(Character Model for the World Wide Web 1.0)[开发中],提供了不同 Unicode 版本字符的规范化。XML 1.1 还增加了行结束字符列表,新增加的 NEL 用于在 IBM 大型机系统中表示行结束(EOL)。这种变化存在争议,有人认为对大型机用户带来的有限好处不值得做这种基础性的改变。还有一些其他的争论,因为一些评论者发现所有的修改都太稳妥了,在 XML 版本变换中不会造成各种可能的互操作性问题。
XML 是基于 Standard Generalized Markup Language(标准通用标记语言,SGML)的,后者由 ISO 8879:1986 [ISO 标准]定义。它在很大程度上简化了 SGML,包括一些调整使其更适合于 Web 环境。
二、XML处理方式
大多数与XML 相关的Java API 在Android 上得到了完全支持,在Android 上可以创建功能强大的移动应用程序,而在Android 上解析XML的技术有三种DOM、SAX、PULL。
1) DOM 解析技术
DOM(Document Object Model,文档对象模型),Android 完全支持DOM 解析,利用DOM 中的对象,可以对XML 文档进行读取、搜索、修改、添加和删除等操作。
使用DOM 对XML 文件进行操作时,首先要解析文件,将文件分为独立的元素、属性和注释等,然后以节点树的形式在内存中对XML 文件进行表示,就可以通过节点树访问文档的内容,并根据需要修改文档——这就是DOM的工作原理。DOM 实现时首先为XML 文档的解析定义一组接口,解析器读入整个文档,然后构造一个驻留内存的树结构,这样代码就可以使用DOM接口来操作整个树结构。
DOM 解析流程:
2) SAX 解析技术
SAX(Simple API for XML,XML 简单应用程序接口),是一个公共的基于事件的XML 文档解析标准。它以事件作为解析XML 文件的模式,它将XML 文件转化成一系列的事件,由不同的事件处理器来决定如何处理。SAX是一个解析速度快并且占用内存少的xml解析器,非常适合android等移动设备,SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读取到的字符是否合法xml语法中的某部分,如果符合就会触发事件。
SAX解析流程:
3) PULL解析技术
Android API 中,另外提供了Android.util.Xml 类,同样可以解析XML 文件,使用方法类似SAX,也都需编写Handler来处理XML 的解析,但是在使用上却比SAX 来得简单。它允许用户的应用程序代码从解析器中获取事件,这与SAX 解析器自动将事件推入处理程序相反。Pull解析器运行方式与SAX解析器类似,它提供了类似ide事件,如:开始元素和结束元素,使用parser.next()可以进入下一个元素并触发相应的事件。事件作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法获取一个Text类型的节点的值。
PULL解析流程:
三、XML性能比较
- 处理时间
- 占用内存
四、使用场景
DOM解析器,是通过将XML文档解析成树状模型并将其放入内存来完成解析工作的,而后对文档的操作都是在这个树状模型上完成的。这个在内存中的文档树将是文档实际大小的几倍。这样做的好处是结构清除、操作方便,而带来的麻烦就是极其耗费系统资源。
SAX解析器,正好克服了DOM的缺点,分析能够立即开始,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中,这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。
选择何种XML解析技术,取决于下面几个因素:
(1) 应用目的:如果打算对数据作出更改并将它输出为 XML,那么在大多数情况下,DOM 是适当的选择。并不是说使用 SAX和PULL 就不能更改数据,但是该过程要复杂得多,因为您必须对数据的一份拷贝而不是对数据本身作出更改。
(2)数据容量: 对于大型文件,SAX和PULL 是更好的选择。
(3)数据使用:如果只有数据中的少量部分会被使用,那么使用 SAX,PULL来将该部分数据提取到应用程序中可能更好。另一方面,如果您知道自己以后会回头引用已处理过的大量信息,那么 SAX,PULL也许不是恰当的选择。
(4) 速度需要: SAX,PULL实现通常要比 DOM 实现更快。
(5) 添加节点:为了能动态给xml添加节点,推荐使用DOM。
(6) 在SAX和PULL都可以使用的情况下,建议使用PULL来解析。
五、总结
对于Android 的移动设备而言,因为设备的资源比较宝贵,内存是有限的,所以我们需要选择适合的技术来解析XML,这样有利于提高访问的速度。
(1)DOM 在处理XML 文件时,将XML 文件解析成树状结构并放入内存中进行处理。当XML 文件较小时,我们可以选DOM,因为它简单、直观。
(2)SAX 则是以事件作为解析XML 文件的模式,它将XML 文件转化成一系列的事件,由不同的事件处理器来决定如何处理。XML 文件较大时,选择SAX 技术是比较合理的。虽然代码量有些大,但是它不需要将所有的XML 文件加载到内存中。这样对于有限的Android 内存更有效,而且Android 提供了一种传统的SAX 使用方法以及一个便捷的SAX 包装器。使用Android.util.Xml 类。
(3)PULL解析并未像SAX 解析那样监听元素的结束,而是在开始处完成了大部分处理。这有利于提早读取XML 文件,可以极大的减少解析时间,这种优化对于连接速度较慢的移动设备而言尤为重要。对于XML 文档较大但只需要文档的一部分时,PULL解析器则是更为有效的方法。
参考推荐:
XML 标准概览(IBM)
W3CSchools(英文)