`
android_mylove
  • 浏览: 399406 次
社区版块
存档分类
最新评论

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(三)——详解Sax方式

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

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

    【Android 创建与解析XML(二)——详解Dom方式】 在Android开发中,处理XML文档时,DOM(Document Object Model)是一种常见的方法。DOM允许开发者通过Java API来构建和操作XML文档,提供了对XML数据的结构化访问...

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

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

    android的xml文件的解析

    在Android开发中,XML文件广泛用于布局设计、配置...在实际项目中,还有一种基于SAX的拉式解析库——PULL解析器(Android提供的`XmlPullParser`),它在内存效率和灵活性之间找到了一个平衡点,也是常用的XML解析方法。

    安卓Android源码——xml-dom201311060201.rar

    其中,`DocumentBuilderFactory`用于创建`DocumentBuilder`对象,`DocumentBuilder`则负责解析XML文件并构建`Document`对象。通过`Document`对象,我们可以获取XML的根元素,并进一步遍历和修改XML结构。 3. **DOM...

    android之xml解析

    ### Android之XML解析——SAX解析器详解 #### 一、引言 在Android开发过程中,XML文件是非常常见的一种数据格式。为了能够更好地理解和利用XML文件中的数据,开发者需要掌握几种常用的XML解析技术。其中,SAX...

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

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

    Android开发编程从入门到精通——Android程序员必备

    ### Android开发编程从入门到精通——Android程序员必备 #### 一、什么是Android及发展历程 - **定义**:Android是一种基于Linux内核的操作系统,主要用于移动设备如智能手机和平板电脑等。 - **历史背景**: - ...

    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源码——WordPress for Android.zip

    "安卓Android源码——WordPress for Android.zip" 这个标题明确指出,我们正在探讨的是关于Android操作系统的源代码,具体是针对WordPress的Android应用版本。WordPress是全球广泛使用的开源博客和内容管理系统,而...

    安卓Android源码——MyNFCDemon.zip

    《安卓Android源码解析——以MyNFCDemon为例》 在深入探讨安卓Android源码之前,我们首先要明白源码对于开发者的重要性。源码是软件开发的基础,它揭示了应用程序内部的工作原理,为开发者提供了深入理解系统行为、...

    安卓Android源码——Spaceassault.zip

    《安卓Android源码深度解析——以Spaceassault项目为例》 在移动开发领域,安卓Android系统因其开源特性,吸引了无数开发者进行二次开发和创新。本文将深入探讨Android源码,以"Spaceassault"项目为例,揭示其背后...

    android 四大组件解析

    本文详细介绍了Android四大组件之一——Activity的核心概念及其使用方法。通过创建和配置Activity,开发者可以构建出具有丰富用户界面的应用程序。掌握Activity的启动、关闭以及数据传递机制对于实现流畅的用户体验...

Global site tag (gtag.js) - Google Analytics