在Android开发中,常常需要对XML进行操作,特别是解析后台数据的时候,需要将数据封装成XML格式类型的文件;而在传递参数给后台程序接口的时候,也需要将数据封装成XML格式的文件,这样做便于数据的传递与解析。在Android开发平台下,有三种方式解析XML文件。
1.DOM方式创建解析XML文档
DOM方式解析XML文件时,会将XML文件的所有内容以文档树的方式存放在内存中,然后允许我们使用DOM API遍历XML树、检索所需的数据。使用DOM操作XML的代码看起来是比较直观的,并且在某些方面比基于SAX方式解析XML实现的方式更加简单。但是,因为DOM需要将XML文件的所有内容以文档树方式存放在内存中,所以内存的消耗比较大,如果XML文件的内容比较小时,采用DOM方式是比较合理的。下面介绍DOM方式解析XML文件的常用属性和方法,如表4-7所示。
表4-7 DOM方式解析XML文件常用属性和方法
下面通过一个示例,介绍如何创建XML文档以及如何通过DOM方式解析XML文档,代码运行结果如图4-13和图4-14所示。
图4-13 DOM方式解析XML示例代码运行结果图(1)
图4-14 DOM方式解析XML示例代码运行结果图(2)
首先,介绍如何通过XML布局实现这一效果,如代码清单4-27所示。
代码清单4-27 DOM方式解析XML示例(第4章\Demo_04_12)main.xml
其次,介绍Activity java代码如何配合布局实现DOM方式解析XML,如代码清单4-28所示。
代码清单4-28 DOM方式解析XML示例(第4章\Demo_04_12)MainActivity.java
最后,需要在AndroidManifest.xml要添加读写权限,具体如代码清单4-29所示。
代码清单4-29 DOM方式解析XML示例(第4章\Demo_04_12)AndroidManifest.xml
2.SAX方式解析XML文档
使用DOM方式解析XML文档,该方式比较符合我们的日常思维方式,容易上手,但是它直接把文档调入内存中,比较耗内存。在这里介绍另一种解析XML的方式——SAX(Simple API for XML)方式。SAX是一个解析速度较快并且占用内存相对少的XML解析器,非常适合用于Android等移动设备。它主要是基于事件驱动,而Android的事件处理机制是基于回调函数。在这里回调函数可以这样理解:在使用SAX解析XML文档时候,在读取到文档开始和结束标签时就会回调一个事件,在读取到其他节点与内容时也会回调一个事件。它并不需要解析整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否符合XML语法中的某部分,如果符合就会触发事件。
既然涉及事件,就有事件源、事件处理器。所谓事件,其实就是一些回调(callback)方法,这些方法(事件)定义在ContentHandler接口中;事件源是在org.xml.sax包中的XMLReader,它通过parser()方法来解析XML文档,并产生事件;事件处理器是org.xml.sax包中ContentHander、DTDHander、ErrorHandler,以及EntityResolver这4个接口的集合。事件源和事件处理器是如何衔接的呢?主要是通过XMLReader相对应的事件处理器注册方法setXXXX()来完成与ContentHander、DTDHander、ErrorHandler,以及EntityResolver这4个接口的连接,四大事件处理器的详细介绍见表4-8所示。
表4-8 SAX接口中包含的事件处理器及其功能介绍
在这里我们无需都继承这4个接口,SDK会为我们提供了DefaultHandler类来进行处理,DefaultHandler类的一些主要事件及其功能如表4-9所示。
表4-9 DefaultHandler类中的主要事件及其功能
如何通过SAX方式解析XML呢?在这里我们需要XmlReader以及DefaultHandler配合起来使用解析XML。接下来我们总结一下SAX解析XML文档的处理思路。
1)创建SAXParserFactory对象。
2)根据SAXParserFactory.newSAXParser()方法返回一个SAXParser解析器。
3)根据SAXParser解析器获取事件源对象XMLReader。
4)实例化一个DefaultHandler对象。
5)连接事件源对象XMLReader到事件处理类DefaultHandler中。
6)调用XMLReader的parse方法从输入源中获取到的XML数据。
7)通过DefaultHandler返回我们需要的数据集合。
下面通过一个示例讲述SAX如何解析XML的过程,XML的数据源结构如代码清单4-30所示,其中,encoding="utf-8"定义了XML的编码格式,有时还可以加standalone属性用于说明文档有没有依赖于外面的任何文件,如果有为“YES”,否则为“NO”,此属性为可选,默认为"YES"。该示例的主要功能是:通过SAX方式解析1.xml文档中的mytag节点的值以及解析tagwithnumber节点的thenumber属性的值,示例代码运行结果如图4-15所示。
图4-15 SAX解析XML运行结果
代码清单4-30 第4章SAX解析XML示例(第4章\Demo_04_13)数据源1.xml
(www.xing528.com)
首先,介绍如何通过xml布局实现SAX解析XML这一效果,如代码清单4-31所示。
代码清单4-31 SAX方式解析XML示例(第4章\Demo_04_13)main.xml
其次,介绍Activity java代码如何配合布局实现SAX方式解析XML这一效果,如代码清单4-32至代码清单4-34所示。
代码清单4-32 SAX方式解析XML示例(第4章\Demo_04_13)MainActivity.java
代码清单4-33 SAX方式解析XML示例(第4章\Demo_04_13)ExampleHandler.java
代码清单4-34 SAX方式解析XML示例(第4章\Demo_04_13)ParsedExample DataSet.java
最后,需要在AndroidManifest.xml配置文件要添加访问权限,具体如代码清单4-35所示。
代码清单4-35 SAX方式解析XML示例(第4章\Demo_04_13)AndroidManifest.xml
3.Pull方式解析XML文档
除了可以使用SAX和DOM解析XML文件,还可以使用Android内置的Pull解析器解析XML文件。Pull解析器的运行方式与SAX解析器相似,也是提供了类似于事件的处理机制,只不过PULL方式读XML回调方法返回的是数字。具体解析过程是:在调用开始元素和结束元素事件时,使用parser.next()可以进入下一个元素并触发相应事件,事件将作为数值代码被发送,可以使用一个switch多分支结构对需要的事件进行处理。下面讲述XmlPullParser解析器常见属性及方法,如表4-10所示。
表4-10 XmlPullParser解析器常见属性及方法
下面通过一个示例具体讲述Pull如何解析XML的过程,XML的数据源结构如代码清单4-36所示(books.xml)。示例的主要功能是将books.xml的节点信息依次解析出来,示例代码运行结果如图4-16所示。
代码清单3-36 Pull解析XML示例(第4章\Demo_04_14)数据源books.xml
图4-16 Pull解析XML示例代码运行结果
首先,介绍如何通过xml布局实现这一效果,如代码清单4-37所示。
代码清单4-37 Pull解析XML示例(第4章\Demo_04_14)main.xml
其次,介绍Activityjava代码如何配合布局实现Pull解析XML,如代码清单4-38至代码清单4-40所示。
代码清单4-38 Pull解析XML示例(第4章\Demo_04_14)MainActivity.java
代码清单4-39 第4章Pull解析XML示例(第4章\Demo_04_14)XmlPull.java
代码清单4-40 第4章Pull解析XML示例(第4章\Demo_04_14)Books.java
最后,需要在AndroidManifest.xml要添加访问权限,具体如代码清单4-41所示。
代码清单4-41 第4章Pull解析XML示例(第4章\Demo_04_14)AndroidManifest.xml
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。