SAX, Simple API for XML, 是一个解析速度快并且占用内存少的XML解析器,适合于移动平台。 它同时既是一种接口,也是指一个软件包。 作为接口,SAX是事件驱动型XML解析的一个标准接口, 也就是说它不需要解析完整个文档,采用相应的事件触发来进行回调处理。
二 . SAX的原理
SAX的工作原理,简单说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束,元素(element)开始与结束,文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直到文档结束。
大多数SAX实现都会产生以下类型的事件:
1. 在文档的开始和结束时触发文档处理事件。
2. 在文档内每一XML元素接受解析的前后触发元素事件
3. 任何元数据通常都由单独的事件交付。
4. 在处理文档的DTD或者Schema时产生DTD或者Schema事件。
5. 产生错误事件用来通知主机,应用程序解析错误。
SAX在解析文档的过程中会产生如下一系列的事件:
1. 创建事件处理程序
2. 创建SAX解析器
3. 将事件处理程序分配给解析器
4. 对文档进行解析,将每个事件发送给处理程序
三. ContentHandler接口
ContentHandler是Java类包中一个特殊的SAX接口,位于org.xml.sax包中。该接口封装了一些对事件处理的方法,当XML解析器开始解析XML输入文档时,它会遇到某些特殊的事件,比如文档的开头和结束,元素开头和结束,以及元素中的字符数据等事件。 当遇到这些事件时,XML解析器会调用ContentHandler接口中相应的方法来响应该事件。 其接口方法有以下几种:
void startDocument();
void endDocument();
void startElement(....);
void endElement(....);
void charaters(); //解析中间元素时调用
四. SAX使用示例
String strXml = "<TextView />"; // 这里获取到XML文件的具体内容字符串
//必须使用try catch, 否则编译器报错
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
XMLReader reader = factory.newSAXParser().getXMLReader(); //XML解析读取类
reader.setContentHandler(new MyContentHandler()); //设置解析的ContentHandler
reader.parse(new InputSource(new StringReader(strXml)));
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
public class MyContentHandler extends DefaultHandler //继承于DefaultHandler
{
@Override
public void startDocument() throws SAXException { //开始解析xml文件
// TODO Auto-generated method stub
super.startDocument();
Log.v("XML", "startDocument");
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException { //开始解析元素
// TODO Auto-generated method stub
super.startElement(uri, localName, qName, attributes);
Log.v("XML", "startElement");
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
// TODO Auto-generated method stub
super.characters(ch, start, length);
Log.v("XML", "characters");
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
// TODO Auto-generated method stub
super.endElement(uri, localName, qName);
Log.v("XML", "endElement");
}
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
Log.v("XML", "endDocument");
}
}