標籤:
在安卓中有很多種解析方式。按照大方向有xml解析和json解析。而,細緻的分,xml和json解析各有自己的很多解析方式。今天這一篇主要介紹xml解析中的pull解析。對於xml的解析方式,我之前在javaweb一些知識中有寫過dom和dom4j等等解析方式。有興趣的讀者可以去javaweb篇裡面找相關的內容。
先自訂一個資料來源,假設就是訪問伺服器返回的xml資料檔案名稱為weather.xml:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?><weather><city><name>北京</name><temp>5°</temp><pm>80</pm></city><city><name>西安</name><temp>-5°</temp><pm>800</pm></city><city><name>南京</name><temp>12°</temp><pm>60</pm></city></weather>
針對此,建立一個javabean,以稍後儲存上邊的資料。每一個city就代表一個對象。這樣更符合物件導向的思想
在mainactivity中程式碼完成解析過程:
package com.itydl.pullparser;import java.io.InputStream;import java.util.ArrayList;import java.util.List;import org.xmlpull.v1.XmlPullParser;import org.xmlpull.v1.XmlPullParserException;import com.itheima.pullparser.domain.City;import android.os.Bundle;import android.app.Activity;import android.util.Xml;import android.view.Menu;import android.view.View;//伺服器向用戶端傳送資料。這些資料一般儲存在xml檔案中的。因此需要對資料進行解析、public class MainActivity extends Activity {List<City> cityList;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}public void click(View v){//擷取到src檔案夾下的資源檔ClassLoader.getResourceAsStream.返回的是InputStream類型的。InputStream is = getClassLoader().getResourceAsStream("weather.xml");//拿到pull解析器對象XmlPullParser是一個介面,不可以newXmlPullParser xp = Xml.newPullParser();//初始化try {xp.setInput(is, "utf-8");//初始化,設定檔案的位置流對象(解析目標檔案對象)和解析編碼格式//擷取當前節點的事件類型,因為pull解析是從xml檔案第一行前端節點往下解析的,“指標”往下移動,標籤(節點)不同,事件類型就不同。//通過事件類型的判斷,我們可以知道當前節點是什麼節點,從而確定我們應該做什麼操作int type = xp.getEventType();City city = null;while(type != XmlPullParser.END_DOCUMENT){//xp.END_DOCUMENT//根據節點的類型,要做不同的操作switch (type) {case XmlPullParser.START_TAG://擷取當前節點的名字if("weather".equals(xp.getName())){//建立city集合對象,用於存放city的javabeancityList = new ArrayList<City>();}else if("city".equals(xp.getName())){//建立city的javabean對象city = new City();}else if("name".equals(xp.getName())){//擷取當前節點的下一個節點的[文本]String name = xp.nextText();city.setName(name);}else if("temp".equals(xp.getName())){//擷取當前節點的下一個節點的文本String temp = xp.nextText();city.setTemp(temp);}else if("pm".equals(xp.getName())){//擷取當前節點的下一個節點的文本String pm = xp.nextText();city.setPm(pm);}break;case XmlPullParser.END_TAG:if("city".equals(xp.getName())){//把city的javabean放入集合中。三個城市city,解析完一個城市就把那個城市執行個體放到集合裡面去。cityList.add(city);}break;}//把指標移動到下一個節點,並返回該節點的事件類型type = xp.next();}for (City c : cityList) {System.out.println(c.toString());}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}運行程式,解析結果如下:
Android初級教程:Android中解析方式之pull解析