XML文件解析

xml是一种标记语言,里面存储一些数据,格式完全可以自己定义。

1.什么是SAX

Android平台通常使用SAX标准来解析,还有一种是DOM。SAX可以逐行边装载边解析,而DOM必须全部导入以后才开始解析。SAX如果读到需要的数据以后就可以停止装载,而DOM必须全部导入再解析。当然,二者各有好处也有坏处。

全称,Simple API for XML,即是指一种接口,也是一个软件包。

2.SAX的基本原理

SAX是以事件为驱动的过程。对文档进行顺序扫描,当扫描到文档的开始与结束,元素开始与结束的时候(通过比对来确定扫描到了哪一个标签),调用时间处理函数,由事件处理函数作出相应的动作(具体干什么由作者自己决定),然后继续同样的扫描,直到文档结束。


3.SAX的常用接口

1)ContentHandler接口,位于org.xml.sax包中。该接口封装了一些对事件的处理方法,当xml解析器开始解析xml输入文档时,会遇到某些特殊的事件,比如文档的开头和结束,元素的开头和结束,以及元素中的字符数据等事件。当遇到这些事件的时候,XML解析器就会调用ContentHandler接口中相应的方法来响应事件。

主要的方法有:

void startDocument()
void endDocument()
void startElement(String uri, String localName, StringqName)
void endElement(String uri, String localName, StringqName)
void characters(char[] ch, int start, int length)

这些方法都是抽象方法,需要进行实现。

2)ErrorHandler接口,主要包含了在解析XML文件的过程中出错时会调用的方法。

3)其它的等用到的时候再说吧,对于解析普通的简单的xml文件,这2个,尤其是ContenHandler已经足够。

4.SAX解析

1)第一步要做的是创建一个SAXParserFactory对象:

SAXParserFactory factoty =SAXParserFactory.newInstance();

2)然后是创建一个XMLReader:

XMLReader reader =factory.newSAXParser().getXMLReader();

到这里先说一下我的理解,要解析就必须有解析器,一个解析器facotory里面可以包含多个解析器,所以第一步是要先有factory。

然后呢,如果把上面的分拆了,第二步就是在工厂里面创建一个新的解析器SAXParser。

然后呢,读取xml文件的最终还是XMLReader,它的作用就是逐行扫描XML文件(因为是在SAX标准而不是DOM标准下生成的XMLReader),当扫描到一些标签的时候,会触发相应的一些事件,触发了以后调用什么方法呢?调用的是自己实现的ContentHandler类里面实现的方法。

所以在SAXParser的基础上创建一个XMLReader。

3)接下来要做的就是为XMLReader设置内容处理器(实质上通常就是ContentHandler):

reader.setContentHandler(newMyContentHandler());

而MyContentHandler是继承DefaultHandler这个类,并且重写了上述的5个方法。

这里很奇怪了,按理说方法都在ContentHandler接口里面,应该要做的是实现ContentHandler接口才对,为什么会去继承DefaultHandler这个实现类呢???

事实上这个涉及到了设计模式的问题。原因是通常情况下我们只需要5个方法,甚至更少,但是这个接口中有很多方法,如果每次都一一去实现就有点浪费时间了。对于其它有些接口也是同样的道理,如果一个接口中有很多方法,我们需要用到的却很少,那么没必要全部去实现一次。

这时候呢,java在org.xml.sax.helpers这个包里面有一个类叫做DefaultHandler,它实现了ContentHandler这个接口,并且所有的方法都是以空方法的形式实现的。于是我们通过继承它,并且重写我们需要的方法就行。

这种设计模式叫做Adapter模式( 待考证

4)最后就是开始解析文档了,需要调用XMLReader里面的parse(InputSourceinput)方法,这个InputSource类的构造方法可以接收比如字符串,Reader,InputStream类型的参数:

假如说收到的xml文件最后全部赋值给一个字符串变量 String s,那么:

reader.parse(new InputSource(newStringReader(s)));





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值