我们使用DOM方式解析xml文档,该方式比较符合我们日常思维方式,容易上手,但是它直接把文档调入内存中,比较耗内存。在这里我们可以用另外一种方式解析xml,这个就是SAX方式。
SAX即是:Simple API for XML
SAX是基于事件驱动的。当然android的事件机制是基于回调函数的,在用SAX解析xml文档时候,在读取到文档开始和结束标签时候就会回调一个事件,在读取到其他节点与内容时候也会回调一个事件。
既然涉及到事件,就有事件源,事件处理器。在SAX接口中,事件源是org.xml.sax包中的XMLReader,它通过parser()方法来解析XML文档,并产生事件。事件处理器是org.xml.sax包中ContentHander、DTDHander、ErrorHandler,以及EntityResolver这4个接口
XMLReader通过相应事件处理器注册方法setXXXX()来完成的与ContentHander、DTDHander、ErrorHandler,以及EntityResolver这4个接口的连接,详细介绍请见下表:
但是我们无需都继承这4个接口,SDK为我们提供了DefaultHandler类来处理,DefaultHandler类的一些主要事件回调方法如下:
由以上可知,我们需要XmlReader 以及DefaultHandler来配合解析xml。
1:创建SAXParserFactory对象
SAXParserFactory factory = SAXParserFactory.newInstance();
2: 根据SAXParserFactory.newSAXParser()方法返回一个SAXParser解析器
SAXParser parser = factory.newSAXParser();
3:根据SAXParser解析器获取事件源对象XMLReader
XMLReader xmlReader = parser.getXMLReader(); 4:实例化一个DefaultHandler对象
handler = new Defaulthandler();
5:连接事件源对象XMLReader到事件处理类DefaultHandler中
xmlReader.setContentHandler(handler);
6:调用XMLReader的parse方法从输入源中获取到的xml数据
xmlReader.parse(inputStream);
7:通过DefaultHandler返回我们需要的数据集合。
最后总结下DefaultHandler几个回调函数
1、public void characters(char[] ch, int start, int length)
char[] characters
解析器所发现的字符数组。
int start
属于该事件的 characters 数组中的一个字符的索引号。
int length
该事件中字符的的个数。
2、public void endElement(String uri, String localName, String qName)
结束元素
uri:名字空间的uri
localName :
一个不包括名称空间的元素名称
String qualifiedName
元素的限定名,即名称空间前缀和元素本地名称的组合。
3、public voidstartDocument()
开始解析文件
4、public void startElement(String uri, String localName, String qName, Attributes attributes)
endElement() 事件告诉您解析器发现了某个元素的结束标签。它有三个参数:
String uri String localName String qualifiedName
这三个参数和startElement一样.
对该事件的典型响应是改变 XML 应用程序中的状态信息。