1、SAX解析XML文件是基于事件驱动的。
事件包括(以abc为例):
startDocument(开始解析文档)
startElement(开始解析元素) –>
characters(解析元素内容) –>abc
endElement(元素解析结束) –>
endDocument(文档解析结束)
2、SAX解析XML文件步奏。
a)创建事件处理程序。
b)创建SAX解析器。
c)将事件处理程序分配给解析器。
d)对文档进行解析。
3、举个例子看看。
a)定义一个类,继承DefaultHandler类(也可以实现ContentHandler接口,当然,哪一个方法比较方便,就不用说了吧),覆写其中的方法。这一步就是在实现事件处理程序。当解析文档产生事件时,会调用这个类的相应方法。代码如下(仅供参考):
package com.mindto.xml;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
* Created by mindto on 2016/3/7.
*/
public class MyContentHandler extends DefaultHandler {
//进行初始化操作,若不需要,完全可以不去覆写
@Override
public void startDocument() throws SAXException {
System.out.println("MyContentHandler --> startDocument()");
}
//完成资源的释放,若不需要,完全可以不去覆写
@Override
public void endDocument() throws SAXException {
System.out.println("MyContentHandler --> endDocument()");
}
/**
* 解析到某一个元素时,调用该方法,如前面例子的 <doc>并不包括 abc</doc>
* @param uri 当前解析节点的命名空间
* @param localName 当前标签不带有前缀名称
* @param qName 当前标签带有前缀名称
* @param attributes 当前标签属性
* @throws SAXException
*/
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
System.out.println("MyContentHandler --> startElement()");
System.out.print("uri = " + uri + " " + "localName = " + localName + " " + "qName = " + qName);
for(int i = 0; i < attributes.getLength(); i ++){
System.out.print(attributes.getValue(i));
}
System.out.println();
}
/**
*解析到某一个元素的结束标签时,调用该方法,如前面例子的 </doc>
* @param uri 当前解析节点的命名空间
* @param localName 当前标签不带有前缀名称
* @param qName 当前标签带有前缀名称
* @throws SAXException
*/
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
System.out.println("MyContentHandler --> endElement()");
super.endElement(uri, localName, qName);
}
/**
* 解析到某个元素内容时,调用该方法,如前面例子的 abc
* @param ch 存储该内容的char数组
* @param start 起始下标
* @param length 长度
* @throws SAXException
*/
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
System.out.println("MyContentHandler --> characters()");
System.out.println(new String(ch,start, length));
}
}
b)按照以下步骤创建解析器。
//创建SAXParserFactory
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
//利用SAXParserFactory得到Reader
XMLReader xmlReader = null;
try {
xmlReader = saxParserFactory.newSAXParser().getXMLReader();
} catch (SAXException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
//设置内容处理器
xmlReader.setContentHandler(new MyContentHandler());
//开始解析文件,产生事件后,会调用MyContentHandler类对象的相应方法进行处理,我们要如何处理数据,均在MyContentHandler类的方法中完成
try {
//这里的MainActivity.this.xmlStr是一个XML文件读取出的字符串。我们完全可以用xmlReader.parse(new InputSource(new FileInputStream("xml文件路径")))进行代替解析本地文件。
xmlReader.parse(new InputSource(new StringReader(MainActivity.this.xmlStr)));
} catch (IOException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
该篇结束,若有不足,望不吝赐教!