`
nanjingjiangbiao_T
  • 浏览: 2595214 次
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

Android 创建与解析XML(一)—— 概述

 
阅读更多

Android 是最常用的智能手机平台,XML 是数据交换的标准媒介,Android 中可以使用标准的XML生成器、解析器、转换器 API,对 XML 进行解析和转换。

XML,相关有DOM、SAX、JDOM、DOM4J、Xerces、JAXP等一堆概念,但是很多人总是会弄混他们之间的关系,这对我们理解XML文件的创建和解析很不利。要挑选一个适合在Android平台上使用的XML解析方案,我们还是得先把这些概念厘清。


XML基本概念

DOM(Document Object Model,文档对象模型)和SAX(Simple API for XML,简单XML应用接口),是JAXP(Java API for XML Processing,Java XML处理的应用接口)定义的2种不同的对XML文档进行分析、处理的方法。

DOM方法是用标准对象模型表示 XML 文档;SAX方法则使用事件模型来处理程序来处理XML。

JAXP完成了对SAX、DOM的包装,它向应用程序提供针对DOM的DocumentBuilderFactory、 DocumentBuilder;以及针对SAX的SAXParserFactory、SAXParser抽象工厂类。在Jave SE中JAXP对应javax.xml.parsers包,DOM对应org.w3c.dom,SAX对应org.xml.sax。


Xerces首先继承并实现了javax.xml.parser包内的SAXParser、SAXParserFactory、DocumentBuilder、DocumentBuilderFactory等抽象类,并提供了JAXP中所定义的DOM、SAX(以及StAX,后面会介绍)这些XML解析方法的实现和相应的Parser。

JDOMDOM4J,是因为有人觉得W3C的DOM标准API太过难用而着手开发的替代API,它们和JAXP一样都是对DOM、SAX的封装,不过JDOM、DOM4J做了更多的事情,相当于上面提到JAXP接口+Xerces DOM实现部分。JDOM并没有自己开发Parser,所以还是需要利用Xerces的Parser部分,而DOM4J自带一个名为Alfred2的Parser,当然也可以使用Xerces的Parser。看起来JAXP具备更好的可移植性,即我们可以通过修改配置文件切换不同的DOM实现和SAX、DOM Parser,JDOM、DOM4J虽然也可以切换Parser,但是DOM实现是无法切换的。(参考: Java XML API 漫谈JAXP全面介绍


XML创建与解析

XML创建主要四种方式:Dom、Sax、Pull、Dom4j

XML解析主要四种方式:Dom、Sax、Pull、Dom4j

其中,利用Dom、Sax、Pull、Dom4j创建的标准XML格式文件,可以由任何一种Dom、Sax、Pull、Dom4j解析方式进行解析。


Android中解析XML

DOM解析器,是通过将XML文档解析成树状模型并将其放入内存来完成解析工作的,然后对文档的操作都是在这个树状模型上完成的。这个在内存中的文档树将是文档实际大小的几倍。这样做的好处是结构清晰、操作方便,而带来的麻烦就是极其耗费系统资源。

SAX解析器,正好克服了DOM的缺点,分析能够立即开始,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中,这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档,它可以在某个条件得到满足时停止解析。


DOM与SAX比较

下面的表格列出了SAX和DOM在一些方面的对照:

SAX DOM
顺序读入文档并产生相应事件,可以处理任何大小的XML文档 在内存中创建文档树,不适于处理大型XML文档。
只能对文档按顺序解析一遍,不支持对文档的随意访问。 可以随意访问文档树的任何部分,没有次数限制。
只能读取XML文档内容,而不能修改 可以随意修改文档树,从而修改XML文档。
开发上比较复杂,需要自己来实现事件处理器。 易于理解,易于开发。
对开发人员而言更灵活,可以用SAX创建自己的XML对象模型。 已经在DOM基础之上创建好了文档树。

通过对SAX和DOM的分析,它们各有自己的不同应用领域:

SAX适于处理下面的问题:
  1. 对大型文档进行处理。
  2. 只需要文档的部分内容,或者只需要从文档中得到特定信息。
  3. 想创建自己的对象模型的时候。

DOM适于处理下面的问题:

  1. 需要对文档进行修改
  2. 需要随机对文档进行访问,例如XSLT解析器。


DOM和SAX的应用场景
1、数据修改:如果打算对数据作出更改并将它输出为 XML,那么在大多数情况下,DOM 是适当的选择。并不是说使用 SAX 就不能更改数据,但是该过程要复杂得多,因为您必须对数据的一份拷贝而不是对数据本身作出更改。
2、数据容量: 对于大型文件,SAX 是更好的选择。
3、数据使用:如果只有数据中的少量部分会被使用,那么使用 SAX 来将该部分数据提取到应用程序中可能更好。 另一方面,如果您知道自己以后会回头引用已处理过的大量信息,那么 SAX 也许不是恰当的选择。
4、速度要求: SAX 实现通常要比 DOM 实现速度更快
基于上面的分析,在基于Android系统的内存和CPU资源比较有限的手持设备上,只要我们不需要修改XML数据或者随机的访问XML数据,SAX尽管可能需要更多的编码工作,但是为了更小的内存和CPU消耗,还是值得的。

另外,Android SDK中已经包含了JAXP对应的javax.xml.parsers包,SAX对应org.xml.sax,DOM对应的org.w3c.dom包,加上Android还提供了android.sax这样的包来方便SAX Handle的开发,基于JAXP和SAX这样的标准方法来开发不仅复杂度不高,即使出现问题在讨论组中寻求解决方案也是比较容易的。(参考: 使用 SAX 处理 XML 文档DOM SAX JAXP DOM4J JDOM xerces解析器

Android中解析XML实现

基于上面的分析,采用JAXP+SAX的方案是我比较看好的。我们首先需要又一个SAXParserFactory的实例,然后从工厂中得到一个SAXParser实例,进而获取一个XMLReader;接下来新建一个Handler类继承自SAX Helpler的DefaultHandler,并实现startDocument()、startElement()、endElement()以及endDocument()等方法,并把这个Handler作为XMLReader的Content Handler;最后以带解析的XML文档为参数调用XMLReader的parse方法即可。具体的代码参考:Android 上使用 XMLAndroid 3.0 平台上创建和解析 XML


1、Android系统中的DOM和SAX实现
Android SDK中包含了JAXP对应javax.xml.parsers包,SAX对应的org.xml.sax,DOM对应的org.w3c.dom包,所以我们就已经有了XML解析所需的JAXP——对SAX和DOM的封装(抽象类)以及SAX和DOM接口类,但是对于JAXP抽象类的实现,以及DOM和SAX接口类的实现在哪里呢?是和Java SE 5.0一样用了Xerces吗? 不!
通过查看Android 1.5的源代码,我看到这部分的代码来自Apache Harmony这个开源的Java SE实现,位于./dalvik/libcore/xml/src/main/java/org/apache/harmony/xml目录。这里包含有一个完整的DOM实现(dom目录),对于javax.xml.parser下的抽象类的实现(parser目录),以及对于SAX接口类的实现(除此以外还包括对XMLPullParser接口的实现)。

2、XmlPull 和 KXML2
XmlPull解析器,提供了资源有限的环境(如J2ME)应用使用的XML解析API,XPP提供了非常简单的接口——包含一个接口、一个异常、一个建立解析器的factory。它采用了类似JAXP的工厂模式,把接口设计和实现分离,KXML2就是一个为J2ME环境优化的一个实现。在Android SDK中,已经包含了XmlPull(org.xmlpull.v1包)以及它的一个AddOn——SAX2 Driver——它使得我们可以通过SAX2的API来操纵XmlPull Parser。另外,通过sourcecode,我们可以看到Android SDK中的XmlPull的实现是KXML2,位于./dalvik/libcore/xml/src/main/java/org/kxml2目录。Apache Harmony的目录中同样有一个ExpatPullParser类实现了XMLPullParser接口,但是却没有XmlSerializer接口的实现,所以只能说Android中的Harmony也部分实现了XmlPull API。XmlPull+KXML2是下一步我要实践的方案,到时候还得学习一下如何“公平”的比较两者的性能。

3、StAX

尽管Android中还没有提供相应的支持,但是Streaming API for XML (StAX) 作为用Java语言处理 XML的最新标准,无论从性能还是可用性上都有出色的表现。它不仅提供了一个快捷、易用、占用内存少的 XML 解析器,它还提供了过滤器接口,允许程序员向应用程序业务逻辑隐藏不需要的文档细节。感兴趣的朋友可以看一看下面的文章。

使用 StAX 解析 XML,第 1 部分: Streaming API for XML (StAX) 简介

使用 StAX 解析 XML,第 2 部分: 拉式解析和事件

使用 StAX 解析 XML,第 3 部分: 使用定制事件和编写 XML



参考推荐:

Android中解析XML数据

android解析XML总结(SAX、Pull、Dom三种方式)

Android 解析XML文件的三种方式 DOM,SAX,PULL

android解析xml文件的方式(推荐,共三篇)

Android 上使用 XML

Android 上使用 XML 和 JSON

Android 3.0 平台上创建和解析 XML


Android XML解析学习——创建XML(共六篇,推荐


分享到:
评论

相关推荐

    Android 创建与解析XML(四)——详解Pull方式

    Android系统中和创建XML相关的包为org.xmlpull.v1,在这个包中不仅提供了用于创建XML的 XmlSerializer,还提供了用来解析XML的Pull方式解析器 XmlPullParser XmlSerializer没有像XmlPullParser那样提取XML事件,而是...

    Android创建与解析XML(二)——详解Dom方式

    Dom方式创建XML,应用了标准xml构造器 javax.xml.parsers.DocumentBuilder 来创建 XML 文档,需要导入以下内容 javax.xml.parsers javax.xml.parsers.DocumentBuilder javax.xml.parsers.DocumentBuilderFactory ...

    Android创建与解析XML(三)——详解Sax方式

    SAX是一种占用内存少且解析速度快的解析器,它采用的是事件启动,不需要解析完整个文档,而是按照内容顺序看文档某个部分是否符合xml语法,如果符合就触发相应的事件,所谓的事件就是些回调方法(callback),这些...

    Android 创建与解析XML(五)——详解Dom4j方式

    1、Dom4j概述 dom4j is an easy to use, open source library for working with XML, XPath and XSLT on the Java platform using the Java Collections Framework and with full support for DOM, SAX and JAXP. ...

    Android程序技术:个人学习助手项目习题详情显示.pptx

    为此,W3C组织推出了一种新的数据交换标准—XML,它是一种通用的数据交换格式, 易于保存树状结构的数据,可以使数据在各种应用程序之间轻松地实现数据的交换。 XML概述 XML概述 2.1 XML解析 2.2 实战演练——习题...

    Android开发与应用——张荣,原书配套课件

    这是Android开发与应用,原书配套的课件,作者张荣,目录如下。 第1章 Android简介 1.1 手机操作系统 1.2 Android起源 1.3 Android特征 1.4 Android体系结构 1.4.1 应用层 1.4.2 应用框架层 1.4.3 ...

    Android 初学中阶高阶书籍_集合打包2

    Android系统概述,Android系统的开发综述,Android的Linux内核与驱动程序,Android的底层库和程序,Android的JAVA虚拟机 和JAVA环境,Android的GUI系统,Android的Audio系统,Android的Video 输入输出系统,Android的多媒体...

    Android 初学中阶高阶书籍_集合打包3

    Android系统概述,Android系统的开发综述,Android的Linux内核与驱动程序,Android的底层库和程序,Android的JAVA虚拟机 和JAVA环境,Android的GUI系统,Android的Audio系统,Android的Video 输入输出系统,Android的多媒体...

    android群雄传

    第1章 Android体系与系统架构 1 1.1 Google生态系统 2 1.2 Android系统架构 2 1.2.1 Linux 3 1.2.2 Dalvik与ART 3 1.2.3 Framework 3 1.2.4 Standard libraries 4 1.2.5 Application 4 1.3 Android App组件...

    白帽子讲浏览器安全.钱文祥(带详细书签).pdf

    6.3.1 Android一例漏洞:使用Intent URL Scheme绕过Chrome SOP 144 6.3.2 iOS的一例漏洞:自动拨号泄露隐私 146 6.3.3 Windows Phone一例未修补漏洞:利用Cortana显示IE中已保存密码 147 6.4 本章小结 149 第2篇...

Global site tag (gtag.js) - Google Analytics