2009年8月13日 星期四

Parsing XML on Android

基本上,要parsing XML 中的資料,有 SAX (Simple API for XML) 及 DOM (Document Object Model) 這兩種 APIs 可用。

SAX 優點:
 在於其記憶體使用量,一般遠低於 DOM 的使用量。因為 DOM 必須把整個 XML 樹放在記憶體,他的記憶體使用量和 XML 的大小成正比。而 SAX 所要耗費的的記憶體,卻是和 XML樹的最大深度相關。

SAX 缺點:
 雖然 SAX 有省記憶體的好處,不過當你的 XML 文件不是很大時,用 SAX 的方式,總是覺得要寫一堆的程式碼,而資料的處理也比較麻煩。

在Android上,目前確定支援SAX (DOM目前我還不確定是否支援) 。

SAX使用範例:
mSAXParserFactory = SAXParserFactory.newInstance();
mSAXParser = mSAXParserFactory.newSAXParser();
mParseHandler = new TreeParserHandler();startElement與endElement則是分別遇到起始的tag與結束的tag會被call,pAttributes物件即代表XML tag的attribute(e.g., <innertag sampleattribute="innertagAttribute" >),可使用atts.getValue("sampleattribute")來取得該屬性的值
mXMLReader = mSAXParser.getXMLReader();

// mParseHandler 為一繼承 org.xml.sax.helpers.DefaultHandler的// class的instance
mXMLReader.setContentHandler(mParseHandler);
mXMLReader.parse(
 new InputSource(參數為inputstream物件)
);
繼承 org.xml.sax.helpers.DefaultHandler
@Override
public void startDocument() throws SAXException {}

@Override
public void endDocument() throws SAXException {}

@Override
public void startElement(String pUri, String pLocalName,  String pName, Attributes pAttributes)
throws SAXException {}

@Override
public void endElement(String pUri, String pLocalName, String pQName) throws SAXException {}

@Override
public void characters(char[] pCh, int pStart, int pLength)
throws SAXException {}
主要是需Override以上幾個function,startDocument和endDocumet顧名思義就是parsing前與parsing後會call的callback。

startElement與endElement則是分別遇到起始的tag與結束的tag會被call,pAttributes物件即代表XML tag的attribute(e.g., <innertag sampleattribute="innertagAttribute" >),可使用atts.getValue(sampleattribute)來取得該屬性的值。

Note. 當在有使用xmlReader.setFeature時,startElement()與endElement()的參數pQName為XML tag名稱;反之,pLocalName為XML tag名稱。

以下為兩個參數的官方說明:
 pLocalName - the local name (without prefix), or the empty string if Namespace processing is not being performed.

 pQName - the qualified name (with prefix), or the empty string if qualified names are not available.

沒有留言:

張貼留言