Android 是最常用的智能手机平台,XML 是数据交换的标准媒介,Android 中可以使用标准的XML生成器、解析器、转换器 API,对 XML 进行解析和转换。
XML,相关有DOM、SAX、JDOM、DOM4J、Xerces、JAXP等一堆概念,但是很多人总是会弄混他们之间的关系,这对我们理解XML文件的创建和解析很不利。要挑选一个适合在Android平台上使用的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。
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实现是无法切换的。(参考: 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文档解析成树状模型并将其放入内存来完成解析工作的,然后对文档的操作都是在这个树状模型上完成的。这个在内存中的文档树将是文档实际大小的几倍。这样做的好处是结构清晰、操作方便,而带来的麻烦就是极其耗费系统资源。DOM与SAX比较
下面的表格列出了SAX和DOM在一些方面的对照:
SAX | DOM |
顺序读入文档并产生相应事件,可以处理任何大小的XML文档 | 在内存中创建文档树,不适于处理大型XML文档。 |
只能对文档按顺序解析一遍,不支持对文档的随意访问。 | 可以随意访问文档树的任何部分,没有次数限制。 |
只能读取XML文档内容,而不能修改 | 可以随意修改文档树,从而修改XML文档。 |
开发上比较复杂,需要自己来实现事件处理器。 | 易于理解,易于开发。 |
对开发人员而言更灵活,可以用SAX创建自己的XML对象模型。 | 已经在DOM基础之上创建好了文档树。 |
通过对SAX和DOM的分析,它们各有自己的不同应用领域:
SAX适于处理下面的问题:DOM适于处理下面的问题:
Android中解析XML实现
基于上面的分析,采用JAXP+SAX的方案是我比较看好的。我们首先需要又一个SAXParserFactory的实例,然后从工厂中得到一个SAXParser实例,进而获取一个XMLReader;接下来新建一个Handler类继承自SAX Helpler的DefaultHandler,并实现startDocument()、startElement()、endElement()以及endDocument()等方法,并把这个Handler作为XMLReader的Content Handler;最后以带解析的XML文档为参数调用XMLReader的parse方法即可。具体的代码参考:Android 上使用 XML 和 Android 3.0 平台上创建和解析 XML
尽管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总结(SAX、Pull、Dom三种方式)
Android 解析XML文件的三种方式 DOM,SAX,PULL
android解析xml文件的方式(推荐,共三篇)
Android XML解析学习——创建XML(共六篇,推荐)