Android XML讀寫(七)
與***個(gè) SAX 示例類似,以上代碼完全沒有特定于 Android 的地方。DOM 解析器將所有 XML 文檔讀取到內(nèi)存中,然后允許您使用 DOM API 遍歷 XML 樹、檢索所需的數(shù)據(jù)。這是非常直觀的代碼,并且,在某些方面比基于 SAX 的實(shí)現(xiàn)更加簡單。但是,DOM 通常更加占用內(nèi)存,因?yàn)橐磺袃?nèi)容都會(huì)先讀取到內(nèi)存中。這對(duì)于運(yùn)行 Android 的移動(dòng)設(shè)備來說是一個(gè)問題,但是當(dāng) XML 文檔始終保持很小的大小時(shí)是可行的。這可能意味著,Android 的開發(fā)人員會(huì)認(rèn)為 SAX 解析在 Android 應(yīng)用程序上更加常見,因此為它提供了額外的實(shí)用工具。Android 還提供了另一種類型的 XML 解析器,它就是 pull 解析器。
XML pull 解析器
如前所述,Android 并未提供對(duì) Java StAX API 的支持。但是,Android 確實(shí)附帶了一個(gè) pull 解析器,其工作方式類似于 StAX。它允許您的應(yīng)用程序代碼從解析器中獲取事件,這與 SAX 解析器自動(dòng)將事件推入處理程序相反。清單 10 顯示了提要解析接口的一個(gè) pull 解析器實(shí)現(xiàn)。
清單 10. 基于 Pull 解析器的實(shí)現(xiàn)
java代碼:
- public class XmlPullFeedParser extends BaseFeedParser {
- public XmlPullFeedParser(String feedUrl) {
- super(feedUrl);
- }
- public List< Message > parse() {
- List< Message > messages = null;
- XmlPullParser parser = Xml.newPullParser();
- try {
- // auto-detect the encoding from the stream
- parser.setInput(this.getInputStream(), null);
- int eventType = parser.getEventType();
- Message currentMessage = null;
- boolean done = false;
- while (eventType != XmlPullParser.END_DOCUMENT && !done){
- String name = null;
- switch (eventType){
- case XmlPullParser.START_DOCUMENT:
- messages = new ArrayList< Message >();
- break;
- case XmlPullParser.START_TAG:
- name = parser.getName();
- if (name.equalsIgnoreCase(ITEM)){
- currentMessage = new Message();
- } else if (currentMessage != null){
- if (name.equalsIgnoreCase(LINK)){
- currentMessage.setLink(parser.nextText());
- } else if (name.equalsIgnoreCase(DESCRIPTION)){
- currentMessage.setDescription(parser.nextText());
- } else if (name.equalsIgnoreCase(PUB_DATE)){
- currentMessage.setDate(parser.nextText());
- } else if (name.equalsIgnoreCase(TITLE)){
- currentMessage.setTitle(parser.nextText());
- }
- }
- break;