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。一個簡單的使用範例,就像底下這樣。
1. SAXParserFactory spf = SAXParserFactory.newInstance();
2. SAXParser sp = spf.newSAXParser();
3.
4. XMLReader xr = sp.getXMLReader();
5. xr.setContentHandler(new MyXMLHandler());
6.
7. xr.parse(/*an input stream */);
8.
9. public class MyXMLHandler extends DefaultHandler {
10. ...
11. void startDocument();
12. void endDocument();
13. void startElement(String namespaceURI, String localName,
14. String qName, Attributes atts);
15. void endElement(String namespaceURI, String localName, String qName);
16. void characters(char ch[], int start, int length);
SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser sp = spf.newSAXParser(); XMLReader xr = sp.getXMLReader(); xr.setContentHandler(new MyXMLHandler()); xr.parse(/*an input stream */); public class MyXMLHandler extends DefaultHandler { ... void startDocument(); void endDocument(); void startElement(String namespaceURI, String localName, String qName, Attributes atts); void endElement(String namespaceURI, String localName, String qName); void characters(char ch[], int start, int length);
關於這個,anddev.org 的 這篇 有完整的教學範例。
如果,你的 XML 只是個字串,那你可以更簡單地用 Xml 這個 class。
1. android.util.Xml
2. static void parse(String xml, ContentHandler contentHandler)
android.util.Xml static void parse(String xml, ContentHandler contentHandler)
熟悉 SAX 或 DOM 的人應該知道,SAX 的好處在於其記憶體使用量,一般遠低於 DOM 的使用量。因為 DOM 必須把整個 XML 樹放在記憶體,他的記憶體使用量和 XML 的大小成正比。而 SAX 所要耗費的的記憶體,卻是和 XML樹的最大深度相關。
雖然 SAX 有省記憶體的好處,不過當你的 XML 文件不是很大時,用 SAX 的方式,總是覺得要寫一堆的程式碼,而資料的處理也比較麻煩。這時,我通常會選用 DOM 。
幸運的是,在 Android 上有相對應的 DOM 處理函式。一個簡單的使用範例如下:
1. import javax.xml.parsers.DocumentBuilderFactory;
2. import javax.xml.parsers.DocumentBuilder;
3. import org.w3c.dom.*;
4.
5. DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
6. Document doc = db.parse(/* an InputStream or String object */);
7. doc.getDocumentElement().normalize();
import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; import org.w3c.dom.*; DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Document doc = db.parse(/* an InputStream or String object */); doc.getDocumentElement().normalize();
不過不幸的是,在這個 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 樹。
1. NodeList nlChilds = nodeSugg.getChildNodes();
2. for (int j = nlChilds.getLength() - 1; j >= 0; --j)
3. Node node = nlChilds.item(j);
NodeList nlChilds = nodeSugg.getChildNodes(); for (int j = nlChilds.getLength() - 1; j >= 0; --j) Node node = nlChilds.item(j);
雖然目前版本中,還有不少的 bugs。不過針對小 XML 文件,只要適當地避免掉這些 bugs,用 DOM 來處理,還是最好的選擇。
在 Android 平台上解析 XML 資料並轉成 DOM
最新推荐文章于 2024-07-15 15:43:54 发布