一. 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相關信息見Android 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=11