android基礎知識09:xml檔案解析03 PULL

來源:互聯網
上載者:User

       本文主要講述android中xml的解析方式。

       android基礎知識09:xml檔案解析01 SAX

        android基礎知識09:xml檔案解析02 DOM

       android基礎知識09:xml檔案解析03 PULL

         在這一節中,我們用另外一種方式解析xml文檔,這種方式也是基於事件驅動的,與SAX方式一樣,它就是PULL方式。只不過PULL方式讀xml回調方法返回的是數字。

   讀取到xml的聲明返回      START_DOCUMENT; 
   讀取到xml的結束返回       END_DOCUMENT ; 
   讀取到xml的開始標籤返回 START_TAG 
   讀取到xml的結束標籤返回 END_TAG 
   讀取到xml的文本返回       TEXT 
xml資料結果還是採用我們先前使用的river.xml檔案。
         採用PULL方式與SAX大同小異,重點在於我們需要知道導航到什麼標籤時候做什麼就行了,依據上一節SAX處理方式的思路,我們也可以在這一節中一樣處理,基本方法是:
基本處理方式是:當PULL解析器導航到文檔開始標籤時就開始執行個體化list集合用來存貯資料對象。導航到元素開始標籤時回判斷元素標籤類型,如果是river標籤,則需要執行個體化         River對象了,如果是其他類型,則取得該標籤內容並賦予River對象。當然它也會導航到文字標籤,不過在這裡,我們可以不用。
 根據以上的解釋,我們可以得出以下處理xml文檔邏輯:
         1:當導航到XmlPullParser.START_DOCUMENT,可以不做處理,當然你可以執行個體化集合對象等等。
         2:當導航到XmlPullParser.START_TAG,則判斷是否是river標籤,如果是,則執行個體化river對象,並調用getAttributeValue方法擷取標籤中屬性值。
         3:當導航到其他標籤,比如Introduction時候,則判斷river對象是否為空白,如不為空白,則取出Introduction中的內容,nextText方法來擷取文本節點內容
         4:當然啦,它一定會導航到XmlPullParser.END_TAG的,有開始就要有結束嘛。在這裡我們就需要判讀是否是river結束標籤,如果是,則把river對象存進list集合中了,並設定river對象為null.

由以上的處理邏輯,我們可以得出以下代碼:

public class PullXml {public List<River> parse(String xmlPath,Context context){        List<River> rivers=new ArrayList<River>();        River river=null;        InputStream inputStream=null;            //獲得XmlPullParser解析器        XmlPullParser xmlParser = Xml.newPullParser();           try {            //得到檔案流,並設定編碼方式            inputStream=context.getResources().getAssets().open(xmlPath);            xmlParser.setInput(inputStream, "utf-8");            //獲得解析到的事件類別目錄,這裡有開始文檔,結束文檔,開始標籤,結束標籤,文本等等事件。            int evtType=xmlParser.getEventType();         //一直迴圈,直到文檔結束             while(evtType!=XmlPullParser.END_DOCUMENT){             switch(evtType){             case XmlPullParser.START_TAG:                String tag = xmlParser.getName();                 //如果是river標籤開始,則說明需要執行個體化對象了                if (tag.equalsIgnoreCase(Contant.RIVER)) {                    river = new River();                   //取出river標籤中的一些屬性值                  river.setName(xmlParser.getAttributeValue(null, Contant.NAME));                  river.setLength(Integer.parseInt(xmlParser.getAttributeValue(null, Contant.LENGTH)));                }else if(river!=null){                    //如果遇到introduction標籤,則讀取它內容                    if(tag.equalsIgnoreCase(Contant.INTRODUCTION)){                    river.setIntroduction(xmlParser.nextText());                    }else if(tag.equalsIgnoreCase(Contant.IMAGEURL)){                        river.setImageurl(xmlParser.nextText());                    }                }                break;                           case XmlPullParser.END_TAG:             //如果遇到river標籤結束,則把river對象添加進集合中               if (xmlParser.getName().equalsIgnoreCase(Contant.RIVER) && river != null) {                    rivers.add(river);                    river = null;                }                break;                 default:break;            }            //如果xml沒有結束,則導航到下一個river節點            evtType=xmlParser.next();         }        } catch (XmlPullParserException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }catch (IOException e1) {            // TODO Auto-generated catch block            e1.printStackTrace();        }         return rivers;     }}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.