Android入门开发之SAX


一. SAX简介

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"); 
    } 
     
     
     
     

相关内容