SAX解析器在解析XML输入的构件时就报告事件,但不会以任何方式存储文档。由事件处理器决定是否要建立数据结构。实际上,DOM解析器是在SAX解析器的基础上建立起来的,它在接收到解析器事件时建立DOM树。DOM相对于SAX,显得更加笨重,对小文件的读写,虽然没有什么分别,但是文件一大起来就难以想象了,如果在移动设备上使用,肯定会严重影响用户体验,而SAX却是一个轻量级的XML解析器,很适合在移动设备上使用!现在,让我来介绍一下SAX在Android设备上的使用方法:
第一步:首先建立一个getXML()的方法:
private void getXML(URL url)
{
try
{
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
XMLReader xr = sp.getXMLReader();
SAXHandler handler = new SAXHandler();
xr.setContentHandler(handler);
InputStreamReader isr = new InputStreamReader(url.openStream(), "UTF-8");
InputSource is = new InputSource(isr);
xr.parse(is);
}
catch(Exception e)
{
e.printStackTrace();
}
}
第二步:当SAX解析器从本地或者从网络上的流读取到符合XML格式要求的内容,就会调用Handler类。SAX在android系统上提供了一个DefaultHandler的Handler子类,并且会自动调用这个DefaultHandler接口的相应方法!重写这个DefaultHandler接口,并命名为:SAXHandler:
import java.util.HashMap;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import android.util.Log;
public class SAXHandler extends DefaultHandler{
public void startDocument() throws SAXException
{
super.startDocument();
}
public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException
{
super.startElement(uri, localName, name, attributes);
}
public void characters(char ch[], int start, int length)
{
}
public void endElement(String uri, String localName, String name) throws SAXException
{
super.endElement(uri, localName, name);
}
public void endDocument() throws SAXException
{
super.endDocument();
}
}
在使用SAX解析器时,需要一个处理器来定义不同的解析器事件的事件动作。DefaultHandler接口定义了若干个回调方法。从上面的代码上可以看出最重要的几个:
# startElement和endElement在每当遇到起始或终止标签时调用。
# characters每当遇到字符数据时调用。
# startDocument和endDocument分别在文档开始和结束时调用一次。
在这回调方法中,进行处理XML文件各个节点。
在此之后,在调用getXML()方法的适当位置添加如下代码便可:
URL url = new URL("http://www.----.com/----.xml");
getXML(url);