今天我們一起通過一個小例子來學習一下使用PULL解析器解析XML檔案。
(1)首先我們放一個檔案名稱為beauties.xml的XML檔案到assets目錄下,檔案內容如下:
範冰冰 28 楊冪 23
然後在src目錄下寫一個與XML中節點(Node)相對應的類Beauty,其內容如下:
package com.pulltest;public class Beauty {//美女姓名private String name;//美女年齡private String age;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAge() {return age;}public void setAge(String age) {this.age = age;}@Overridepublic String toString() {return "美女資料 [年齡=" + age + ", 姓名=" + name + "]";}}
(2)在src目錄下寫一個介面IBeautyParser,其內容如下:
package com.pulltest;import java.io.InputStream;import java.util.List;public interface IBeautyParser {/** * * 解析輸入資料流,擷取Beauty列表 * @param is * @return * @throws Exception */public List parse(InputStream is) throws Exception;/** * * 序列化Beauty對象集合,得到XML形式的字串 * @param beauties * @return * @throws Exception */public String serialize(List beauties) throws Exception;}
在src目錄下寫一個上面介面的實作類別BeautyParserImpl,其內容如下,代碼已經詳細注釋:
package com.pulltest;import java.io.InputStream;import java.util.ArrayList;import java.util.List;import org.xmlpull.v1.XmlPullParser;import android.util.Xml;public class BeautyParserImpl implements IBeautyParser{@Overridepublic List parse(InputStream is) throws Exception {List mList = null;Beauty beauty = null;// 由android.util.Xml建立一個XmlPullParser執行個體XmlPullParser xpp = Xml.newPullParser();// 設定輸入資料流 並指明編碼方式xpp.setInput(is,"UTF-8");// 產生第一個事件int eventType = xpp.getEventType();while (eventType != XmlPullParser.END_DOCUMENT){ switch (eventType) { // 判斷當前事件是否為文檔開始事件 case XmlPullParser.START_DOCUMENT: mList = new ArrayList(); // 初始化books集合 break; // 判斷當前事件是否為標籤元素開始事件 case XmlPullParser.START_TAG: if (xpp.getName().equals("beauty")) { // 判斷開始標籤元素是否是book beauty = new Beauty(); } else if (xpp.getName().equals("name")) { eventType = xpp.next();//讓解析器指向name屬性的值 // 得到name標籤的屬性值,並設定beauty的name beauty.setName(xpp.getText()); } else if (xpp.getName().equals("age")) { // 判斷開始標籤元素是否是book eventType = xpp.next();//讓解析器指向age屬性的值 // 得到age標籤的屬性值,並設定beauty的age beauty.setAge(xpp.getText()); } break; // 判斷當前事件是否為標籤元素結束事件 case XmlPullParser.END_TAG: if (xpp.getName().equals("beauty")) { // 判斷結束標籤元素是否是book mList.add(beauty); // 將book添加到books集合 beauty = null; } break; } // 進入下一個元素並觸發相應事件 eventType = xpp.next(); } return mList;}@Overridepublic String serialize(List beauties) throws Exception {// TODO Auto-generated method stubreturn null;}}
(3) 在layout目錄下建立一個布局檔案pulltest.xml,其內容如下:
在src目錄下的Activity內容如下:
package com.pulltest;import java.io.InputStream;import java.util.List;import android.app.Activity;import android.os.Bundle;import android.widget.TextView;import com.example.pulltest.R;public class PullTestActivity extends Activity{//裝載Beauty類型的鏈表,其內容由XML檔案解析得到private List beautyList;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.pulltest);try {//通過assertmanager的open方法擷取到beauties.xml檔案的輸入資料流InputStream is = this.getAssets().open("beauties.xml");//初始化自訂的實作類別BeautyParserImplBeautyParserImpl pbp = new BeautyParserImpl();//調用pbp的parse()方法,將輸入資料流傳進去解析,返回的鏈表結果賦給beautyListbeautyList = pbp.parse(is);} catch (Exception e) {e.printStackTrace();}setupViews();}/** * 將資料顯示到手機介面上 */private void setupViews(){String result = "";for (Beauty b : beautyList) { result += b.toString(); } TextView textView = (TextView) findViewById(R.id.textView); textView.setText(result); }}
我們右鍵運行一下android project,結果如下:
:
Android之PULL解析XML