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


你可能感兴趣的:(Android入门开发之SAX)