android实现XML文件解析之SAX解析器

 

XML文件:可扩展标记语言,在android中应用非常广泛。

android中常用的XML解析方式有三种,分别是:SAX解析器、、DOM解析器和PULL解析器。其中SAX解析器由于其解析速度快,占用内存少,而被普遍采用。

 

SAX方式

SAXSimple API for XML的缩写。是一个包也可以看成是一些接口。

相比于DOM而言SAX是一种速度更快,更有效,占用内存更少的解析XML文件的方法。它是逐行扫描,可以做到边扫描边解析,因此SAX可以在解析文档的任意时刻停止解析。非常适用于Android等移动设备。

SAX是基于事件驱动的。所谓事件驱动就是说,它不用解析完整个文档,在按内容顺序解析文档过程中,SAX会判断当前读到的字符是否符合XML文件语法中的某部分。如果符合某部分,则会触发事件。所谓触发事件,就是调用一些回调方法。当然android的事件机制是基于回调方法的,在用SAX解析xml文档时候,在读取到文档开始和结束标签时候就会回调一个事件,在读取到其他节点与内容时候也会回调一个事件。在SAX接口中,事件源是org.xml.sax包中的XMLReader,它通过parser()方法来解析XML文档,并产生事件。事件处理器是org.xml.sax包中ContentHanderDTDHanderErrorHandler,以及EntityResolver4个接口。

这四个接口的详细说明如下:

 

事件处理器名称

事件处理器处理的事件

XMLReader注册方法

ContentHander

XML文档的开始与结束,

XML文档标签的开始与结束,接收字符数据,跳过实体,接收元素内容中可忽略的空白等。

setContentHandler(ContentHandler h)

DTDHander

处理DTD解析时产生的相应事件

setDTDHandler(DTDHandler h)

ErrorHandler

处理XML文档时产生的错误

setErrorHandler(ErrorHandler h)

EntityResolver

处理外部实体

setEntityResolver(EntityResolver e)

 

我们用来做内容解析的回调方法一般都定义在ContentHandler接口中

ContentHandler接口常用的方法:

startDocument()  

     当遇到文档的开头的时候,调用这个方法,可以在其中做一些预处理的工作。
endDocument()    

     当文档结束的时候,调用这个方法,可以在其中做一些善后的工作。 
startElement(String namespaceURI, String localName,String qName, Attributes atts)    

     当读到开始标签的时候,会调用这个方法。namespaceURI就是命名空间,localName是不带命名空间前缀的标签名,qName是带命名空间前缀的标签名。通过atts可以得到所有的属性名和相应的值。
endElement(String uri, String localName, String name)   

   在遇到结束标签的时候,调用这个方法。
characters(char[] ch, int start, int length)    

    这个方法用来处理在XML文件中读到的内容。例如:<high data="30"/>主要目的是获取high标签中的值。

第一个参数用于存放文件的内容,后面两个参数是读到的字符串在这个数组中的起始位置和长度,使用new String(ch,start,length)就可以获取内容。

注意:

SAX的一个重要特点就是它的流式处理,当遇到一个标签的时候,它并不会纪录下之前所碰到的标签,即在startElement()方法中,所有能够知道的信息,就是标签的名字和属性,至于标签的嵌套结构,上层标签的名字,是否有子元属等等其它与结构相关的信息,都是不知道的,都需要你的程序来完成。这使得SAX在编程处理上没有DOM方便。

现在我们截取一段XML文件来做解析,其调用方法是这样的:

<?xml version="1.0"?>         ---------->         startDocument()

<weather>                               ---------->         startElement

<forecast_information>       ---------->         startElement

<city>                                       ---------->         startElement

beijing                                     ---------->        characters

</city>                                      ---------->        endElement

</forecast_information >     ---------->        endElement

</weather >                            ---------->        endElement

文档结束                                 ---------->        endDocument()

SAX的解析步骤:

首先需要注意的是:

SAX还为其制定了一个Helper类:DefaultHandler它实现了ContentHandler这个接口,但是其所有的方法体都为空,在实现的时候,你只需要继承这个类,然后重载相应的方法即可。

使用SAX解析XML文件一般有以下五个步骤:
1
、创建一个SAXParserFactory对象;
2
、调用SAXParserFactory中的newSAXParser方法创建一个SAXParser对象;
3
、然后在调用SAXParser中的getXMLReader方法获取一个XMLReader对象;

4、实例化一个DefaultHandler对象

5、连接事件源对象XMLReader到事件处理类DefaultHandler

6、调用XMLReaderparse方法从输入源中获取到的xml数据

7、通过DefaultHandler返回我们需要的数据集合。

 

转载:http://blog.163.com/xk_maomao/blog/static/17601634520126313101694/

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值