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接口中相应的方法来响应事件。
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对象:
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)));