2008年7月21日 星期一

在 Android 平台上解析 XML 資料並轉成 DOM

How to get your data from XML with DOM on Android platform?

一般來說,要擷取 XML 中的資料,有 SAX (Simple API for XML) 及 DOM (Document Object Model) 這兩種 APIs 可用。以 SAX 來說,在 Android 上,你可以使用支持 SAX API 的 SAXParserFactory 和 XMLReader。一個簡單的使用範例,就像底下這樣。

關於這個,anddev.org 的 這篇 有完整的教學範例。

如果,你的 XML 只是個字串,那你可以更簡單地用 Xml 這個 class。

熟悉 SAX 或 DOM 的人應該知道,SAX 的好處在於其記憶體使用量,一般遠低於 DOM 的使用量。因為 DOM 必須把整個 XML 樹放在記憶體,他的記憶體使用量和 XML 的大小成正比。而 SAX 所要耗費的的記憶體,卻是和 XML樹的最大深度相關。

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

幸運的是,在 Android 上有相對應的 DOM 處理函式。一個簡單的使用範例如下:

不過不幸的是,在這個 m5-rc15 的版本,關於 org.w3c.dom.* 相關類別的實現,倒是有不少的臭蟲。

目前 Android 中,所有 DOM 的實現類,都放在 android.xml.dom 這個 package 裡面。就拿 Element.getAttributes() 來說,他的程式碼裡,竟然是 always return null,搞的你只能用 Element.getAttribute(String name)。

另外,Node.getNextSibling() 和 Node.getPreviousSibling() 這兩個函式,也是錯誤百出。我建議你用底下的方式,來 traverse DOM 樹。

雖然目前版本中,還有不少的 bugs。不過針對小 XML 文件,只要適當地避免掉這些 bugs,用 DOM 來處理,還是最好的選擇。

沒有留言:

張貼留言