android 解析xml接口,在Android中解析XML数据(一)

在Android中解析XML数据

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

XML解析的基本概念

SAX(Simple API for XML)和DOM(文档对象模型)是JAXP规范(Java API for XML

Processing)定义的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。

至于JDOM和DOM4J,是因为有人觉得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实现是无法切换的。

参考: JavaEye Robbin Java XML API

漫谈

IBM DW JAXP Brett McLaughlin 全面介绍,第 1

部分

Android系统中XML解析方案的选择

DOM解析器是通过将XML文档解析成树状模型并将其放入内存来完成解析工作的,而后对文档的操作都是在这个树状模型上完成的。这个在内存中的文档树将是文档实际大小的几倍。这样做的好处是结构清除、操作方便,而带来的麻烦就是极其耗费系统资源。而SAX正好克服了DOM的缺点,分析能够立即开始,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中,这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。

选择 DOM 还是选择 SAX,这取决于下面几个因素:

应用程序的目的:如果打算对数据作出更改并将它输出为 XML,那么在大多数情况下,DOM 是适当的选择。并不是说使用 SAX

就不能更改数据,但是该过程要复杂得多,因为您必须对数据的一份拷贝而不是对数据本身作出更改。

数据容量:

对于大型文件,SAX 是更好的选择。

数据将如何使用:如果只有数据中的少量部分会被使用,那么使用 SAX 来将该部分数据提取到应用程序中可能更好。

另一方面,如果您知道自己以后会回头引用已处理过的大量信息,那么 SAX 也许不是恰当的选择。

对速度的需要: 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这样的标准方法来开发不仅复杂度不高,即使出现问题在讨论组中寻求解决方案也是比较容易的。

Android系统中XML解析的实践

基于上面的分析,采用JAXP+SAX的方案是我比较看好的。我们首先需要又一个SAXParserFactory的实例,然后从工厂中得到一个SAXParser实例,进而获取一个XMLReader;接下来新建一个Handler类继承自SAX

Helpler的DefaultHandler,并实现startDocument()、startElement()、endElement()以及endDocument()等方法,并把这个Handler作为XMLReader的Content

Handler;最后以带解析的XML文档为参数调用XMLReader的parse方法即可。

具体的代码大家可以看看anddev.org的站长plusminus这篇很不错的HOWTO,Parsing

XML from the Net – Using the SAXParser,或者看看IBM DW上的文章,理解SAX。

其他

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

解析器,它还提供了过滤器接口,允许程序员向应用程序业务逻辑隐藏不需要的文档细节。感兴趣的朋友可以看一看下面的文章。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值