android之Pull解析XML

來源:互聯網
上載者:User

為最終。

代碼結構:

我們先來看看代碼:

main.xml

<?xml version="1.0" encoding="utf-8"?><br /><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"<br /> android:orientation="vertical"<br /> android:layout_width="fill_parent"<br /> android:layout_height="fill_parent"<br /> ><br /><TextView<br />android:id="@+id/showBeauty"<br /> android:layout_width="fill_parent"<br /> android:layout_height="wrap_content"<br /> /><br /></LinearLayout><br />

Activity的代碼

package cn.com.pulltest;</p><p>import java.io.InputStream;<br />import java.util.ArrayList;</p><p>import org.xmlpull.v1.XmlPullParser;<br />import org.xmlpull.v1.XmlPullParserFactory;</p><p>import android.app.Activity;<br />import android.os.Bundle;<br />import android.util.Log;<br />import android.widget.TextView;</p><p>public class PullActivity extends Activity {<br />private String result = "";<br />private ArrayList<Beauty> beauties = new ArrayList();<br /> @Override<br /> public void onCreate(Bundle savedInstanceState) {<br /> super.onCreate(savedInstanceState);<br /> setContentView(R.layout.main);<br /> try {<br /> // 以流的形式擷取src目錄下的xml檔案(此檔案的父親檔案夾必須是src)<br />InputStream InputStream = this.getClass().getClassLoader().getResourceAsStream("beauties.xml");<br />// 擷取一個XmlPullParser<br />XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance();<br />XmlPullParser parser = xmlPullParserFactory.newPullParser();<br />// 設定輸入資料流已經編碼方式<br />parser.setInput(InputStream, "UTF-8");<br />// 擷取當前的事件類型<br />int eventType = parser.getEventType();<br />Beauty beauty = null;<br />while(XmlPullParser.END_DOCUMENT!=eventType){<br />String nodeName = parser.getName();</p><p>switch (eventType) {<br />case XmlPullParser.START_TAG:<br />if(nodeName.equals("beauty")){<br />beauty = new Beauty();<br />}<br />if(nodeName.equals("name")){<br />beauty.setName(parser.nextText());<br />}<br />if(nodeName.equals("age")){<br />beauty.setAge(parser.nextText());<br />}<br />break;</p><p>case XmlPullParser.END_TAG:<br />if(nodeName.equals("beauty")&&beauty!=null){<br />beauties.add(beauty);<br />}</p><p>break;<br />default:<br />break;<br />}<br />// 手動的觸發下一個事件<br />eventType = parser.next();<br />Log.i("PullActivity", eventType+"");<br />}</p><p>for(Beauty beauty2 : beauties){<br />result+="/n"+beauty2.toString();<br />}<br />//result = beauties.size()+"";<br />TextView textView = (TextView) findViewById(R.id.showBeauty);<br />textView.setText("最終結果: /n "+result);</p><p>} catch (Exception e) {<br />e.printStackTrace();<br />}</p><p> }<br /> /**<br /> *<br /> * @author chenzheng<br /> * 這裡使用內部類是為了效率考慮,內部類要比單獨頂一個bean類更加的高效以及節約空間<br /> *<br /> */<br /> private class Beauty{<br /> String name;<br /> String age;<br />public String getName() {<br />return name;<br />}<br />public void setName(String name) {<br />this.name = name;<br />}<br />public String getAge() {<br />return age;<br />}<br />public void setAge(String age) {<br />this.age = age;<br />}<br />@Override<br />public String toString() {<br />return "美女資料 [年齡=" + age + ", 姓名=" + name + "]";<br />} </p><p> }</p><p>}

 

beauties.xml

<?xml version="1.0" encoding="UTF-8"?></p><p><beauties></p><p><beauty></p><p><name>林志玲</name></p><p><age>28</age></p><p></beauty></p><p><beauty></p><p><name>楊冪</name></p><p><age>23</age></p><p></beauty></p><p></beauties><br />

這裡的book.xml沒有用到。

AndroidManifest.xml使用的是預設的。

運行,我們就可以看到了剛開始的那種結果了。

 

----------------------------------------------------------------------------------------

 

     這裡對xml進行解析時,需要注意的是,beauties.xml的位置,我們這裡多添加了一個book.xml也是為了讓大家明白,xml檔案的確切位置應該是在src下,而不是src下的子檔案夾下。

 

   

----------------------------------------------------------------------------------------

      一般,我們使用java解析xml,主要還是有兩種方式,一種方式是SAX解析,另一種是DOM解析。當然還有一系列的其他第三方解析API,如JDOM/DOM4J.他們各自有各自的優缺點。這裡我們主要分析下最基礎的兩種解析方式,sax解析和dom解析。

      兩者依賴的解析機制是完全不同的。sax解析,依賴於事件觸發機制,你可以認為我們在讀取xml的時候,每遇到一個xml內容都會觸發相應的事件,我們一行行的往下讀,事件也自動的一個個的往下觸發,一直到最終結束。代碼中,我們則需要實現一個defaultHandler,來定義當xml讀到什麼內容時,進行什麼樣子的操作。sax解析,只能從文檔頭一直讀到尾,中間不能停止也不能對檔案進行修改。直到解析完了整個文檔才會返回。

     dom解析,則是通過在記憶體中形成一個節點樹來完成xml解析,它雖然可以快速的定位xml中的某個位置,並且可以對其進行修改操作,但是它對記憶體的要求比較大。特別是當xml檔案比較大的時候,這個缺點就更嚴重了。對於手機來說,這很致命。

     SAX方式的特點是需要解析完整個文檔才會返回,如果在一個XML文檔中我們只需要前面一部分資料,但是使用SAX方式還是會對整個文檔進行解析,儘管XML文檔中後面的大部分資料我們其實都不需要解析,因此這樣實際上就浪費了處理資源。

     為瞭解決點這種缺陷,Android利用另一種更加高效方便的xml解析方式對xml檔案進行解析,這就是Pull解析。

      Pull解析器和SAX解析器雖有區別但也有相似性。他們的區別為:SAX解析器的工作方式是自動將事件推入註冊的事件處理器進行處理,因此你不能控制事件的處理主動結束;而Pull解析器的工作方式允許你在應用程式代碼中主動從解析器中擷取事件,正因為是主動擷取事件,因此可以在滿足了需要的條件後不再擷取事件,結束解析。

   

       OPhone/Android系統中和Pull方式相關的包為org.xmlpull.v1,在這個包中提供了Pull解析器的工廠類XmlPullParserFactory和Pull解析器XmlPullParser,XmlPullParserFactory執行個體調用newPullParser方法建立XmlPullParser解析器執行個體,接著XmlPullParser執行個體就可以調用getEventType()和next()等方法依次主動提取事件,並根據提取的事件類型進行相應的邏輯處理。

    代碼如下

// 以流的形式擷取src目錄下的xml檔案(此檔案的父親檔案夾必須是src)<br />InputStream InputStream = this.getClass().getClassLoader().getResourceAsStream("beauties.xml");<br />// 擷取一個XmlPullParser<br />XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance();<br />XmlPullParser parser = xmlPullParserFactory.newPullParser();<br />// 設定輸入資料流已經編碼方式<br />parser.setInput(InputStream, "UTF-8");

我們然後就可以通過XmlPullParser裡面提供的方法進行解析了,這裡列出幾個重要的方法說明

//在xml讀取的開始調用,並觸發讀取檔案時的第一個事件,返回的是事件的標示 

public int getEventType() throws XmlPullParserException ;  

//遍曆下一個事件,返回一個事件的類型  

public int next() throws XmlPullParserException, IOException  

//得到當前Tag名字  

public String getName();  

//擷取文本  

public String getText();  

  

//得到當前Tag下面的屬性數量  

public int getAttributeCount() ;  

//得到當前Tag下面指定位置的屬性名稱  

public String getAttributeName(int index);  

  

//得到當前Tag下面指定位置的屬性植  

public String getAttributeValue(int index);  

 

//如果當前事件是一個start_tag並且下一個元素就是文本的話,那麼就將這個常值內容返回;如果下一個元素直接就是end_tag的話,那麼久返回Null 字元串;其他情況返回異常。

public String getNextText();

-------------------------------------------------------------------------

我們總結下pull解析的代碼步驟:

第一步:我們需要先定義一個xml檔案(當然也可以是從網路上擷取的xml檔案)

第二步:建立一個XmlPullParser對象,用於對檔案進行解析

第三步:通過parser.setInput()方法,將檔案和檔案解析器關聯起來。

第四步:調用getEventType();方法正式開始解析。

第五步:在while迴圈中處理xml

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.