android解析xml文件的方式(其三)

上一節中,咱們使用SAX方式解析xml文檔, SAX方式是基於事件驅動的。固然android的事件機制是基於回調函數的。在這一節中,咱們用另一種方式解析xml文檔,這種方式也是基於事件驅動的,與SAX方式同樣,它就是PULL方式。只不過PULL方式讀xml回調方法返回的是數字。 android

   讀取到xml的聲明返回      START_DOCUMENT; 
   讀取到xml的結束返回       END_DOCUMENT ; 
   讀取到xml的開始標籤返回 START_TAG 
   讀取到xml的結束標籤返回 END_TAG 
   讀取到xml的文本返回       TEXT 
xml數據結果仍是採用咱們先前使用的river.xml文件。 函數

採用PULL方式與SAX大同小異,重點在於咱們須要知道導航到什麼標籤時候作什麼就好了,依據上一節SAX處理方式的思路,咱們也能夠在這一節中同樣處理,基本方法是: this

基本處理方式是:當PULL解析器導航到文檔開始標籤時就開始實例化list集合用來存貯數據對象。導航到元素開始標籤時回判斷元素標籤類型,若是是river標籤,則須要實例化River對象了,若是是其餘類型,則取得該標籤內容並賦予River對象。固然它也會導航到文本標籤,不過在這裏,咱們能夠不用。 編碼

 根據以上的解釋,咱們能夠得出如下處理xml文檔邏輯: url

1:當導航到XmlPullParser.START_DOCUMENT,能夠不作處理,固然你能夠實例化集合對象等等。 spa

2:當導航到XmlPullParser.START_TAG,則判斷是不是river標籤,若是是,則實例化river對象,並調用getAttributeValue方法獲取標籤中屬性值。 .net

3:當導航到其餘標籤,好比Introduction時候,則判斷river對象是否爲空,如不爲空,則取出Introduction中的內容,nextText方法來獲取文本節點內容 code

4:固然啦,它必定會導航到XmlPullParser.END_TAG的,有開始就要有結束嘛。在這裏咱們就須要判讀是不是river結束標籤,若是是,則把river對象存進list集合中了,並設置river對象爲null. xml

由以上的處理邏輯,咱們能夠得出如下代碼: 對象

View Code
複製代碼
   
public List < River > parse(String xmlPath){ List < River > rivers = new ArrayList < River > (); River river = null ; InputStream inputStream = null ; // 得到XmlPullParser解析器 XmlPullParser xmlParser = Xml.newPullParser(); try { // 獲得文件流,並設置編碼方式 inputStream = this .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(RIVER)) { river = new River(); // 取出river標籤中的一些屬性值 river.setName(xmlParser.getAttributeValue( null , NAME)); river.setLength(Integer.parseInt(xmlParser.getAttributeValue( null , LENGTH))); } else if (river != null ){ // 若是遇到introduction標籤,則讀取它內容 if (tag.equalsIgnoreCase(INTRODUCTION)){ river.setIntroduction(xmlParser.nextText()); } else if (tag.equalsIgnoreCase(IMAGEURL)){ river.setImageurl(xmlParser.nextText()); } } break ; case XmlPullParser.END_TAG: // 若是遇到river標籤結束,則把river對象添加進集合中 if (xmlParser.getName().equalsIgnoreCase(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; }
複製代碼

運行結果與其餘2個同樣:

相關文章
相關標籤/搜索