Android XML解析学习——Sax方式(续)

一.基础知识

在《Android XML解析学习——Sax方式》中我们学习了Android上使用JavaSAX进行XML解析的方式。而在Android平台上使用SAX解析XML,除了使用JavaAPI外,还可以使用Android SDK带的 ="EN-US">API来实现。Android SDK中和SAX解析相关的包为android.sax,在这个包中Android提供了都有的SAX API,使用它们可以更加方便的进行SAX方式的XML解析。

xml文件中在不同的位置处有相同的元素标签名时,在相应的事件回调处理函数中往往就需要进行判断处理。比如USGSxml形式的地震数据为:

 

我们看到在<entry>开始前就有<updated><title><link>等元素标签,而<entry></entry>元素中也包含这些标签名,在SAX解析时都会产生相应的事件,但我们实际需要处理的为<entry></entry>元素中的这些标签产生的事件,因此我们设置了一个变量

 

 

来进行判断。对以上的xml数据来说,这样的处理还不会出现问题,但是如果需要解析一个更加复杂的XML文档,则类似的需要对不同位置处的相同标签名进行判断这样的处理可能会带来各种各样的Bug

而使用android.sax包中的API来进行SAX方式的解析则不会有以上的问题。实际上使用android.sax包还有点结合了我们以后会详细介绍的DOM方式,首先获取需要解析部分的根元素,然后使用getChild方法获取具体的某个子元素,之后就可以为具体的元素设置事件处理的回调函数,比如为一个元素分别设置元素开始的事件处理setStartElementListener,元素包含的文本内容结束的事件处理setEndTextElementListener和元素结束的事件处理setEndElementListener

概括的来说,android.sax包进行XML解析的过程为用DOM的方式获取具体位置处的元素,然后为其设置需要的事件处理函数。具体的实现我们可以看实例开发部分的代码。

Android SDK中提供的和XML相关的还有一个类:android.util.Xml,在该类中提供了比较实用的XML相关的类方法,比如开始解析的parse方法,和直接创建XmlPullParserXmlSerializer(这两块内容以后介绍)的方法等。

 

下面我们就用上面介绍的Android SDK中的SAX方式来实现解析XML形式的USGS地震数据的Demo例子。

二.实例开发

我们要完成的效果图如下图1所示:

 

1 ListView列表显示的地震数据

 

和上一部分Demo例子的一样,也是解析完地震数据后用ListView列表的方式显示每条地震的震级和地名信息。

新建一个Android工程AndroidXMLDemoSaxII

添加进上一个Demo工程AndroidXMLDemoSax中的EarthquakeEntry.java文件,如果需要从本地读取xml数据的话,同时在assets文件夹下添加保存为xml格式了的USGS地震数据USGS_Earthquake_1M2_5.xml,如果需要联网读取的话,在manifest.xml文件中添加权限:

 

并修改res/layout下的main.xml为:

 

 

接下来就来新建添加一个类AndroidSaxEarthquakeHandler,以Android SDK提供的包android.sdkAPI完成解析地震数据的具体逻辑实现,内容如下:

 

 

开头处定义了解析需要的元素标签名称,因为getChild方法获取子元素时需要命名空间,因此还新定义了USGSxml数据中包含的两个命名空间:

 

在定义的用于解析xml数据的方法中

public ArrayList<EarthquakeEntry> parse(InputStream inStream)

首先获取xml文档的根元素:

RootElement root = new RootElement(ATOM_NAMESPACE, kRootElementName);

有了根元素之后,就可以使用类似DOMgetChild方法获取具体的某个位置处的子元素,并且可以为具体的子元素注册事件处理器和在对应的回调函数中实现具体的处理逻辑。

从程序中我们可以看到,我们只为<entry>元素和<entry></entry>包含的子元素注册了事件处理器,因此即使xml文档开始处有<updated><title><link>等同名的元素标签,但也不会进行处理。因此和上一部分的Demo相比,就不再需要设置标志变量用来判断,而且看起来也更加简单了。

虽然写法不同了,但是对具体标签的处理逻辑和上一部分Demo中是一样的,因为处理的xml文档内容没有变。

程序的最后调用android.util.Xml类的类方法parse直接进行解析,也更加方便了。

 

其中Xmlparse方法的ContentHandler参数由根元素通过getContentHandler()方式获得。

最后添AndroidXMLDemoSaxII.java文件中的内容,内容和上一个Demo工程AndroidXMLDemoSax中的AndroidXMLDemoSax.java基本一样,

 

 

只是把进行SAX解析的部分换成了如下方式:

 

完成了,可以保存运行看下效果。

 

三.总结

Android平台提供了相当强大的XML解析支持,不仅包含了Java SDK中用来XML处理的API,而且Android SDK还提供了特有的用于SAX解析XML的包android.sax。使用这个包中的API可以更加方便解析,特别是当要解析的xml文档中在不同的层级位置处有多个相同名称的标签但需要分别进行不同处理时,同时也有更好的鲁棒性,减少解析时产生Bug的可能性。

以上我们介绍的都是SAX方式解析XML,而解析XML常用的还有DOM方式,这部分内容我们以后接着学习。

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值