XML解析PULL方法

解析XML通常有3種方法:

1)SAX:SAX解析器的優點是解析速度快,佔用內存少。

2)DOM:對於特別大的文檔,解析和加載整個文檔將會很耗資源。

3)PULL:PULL解析器小巧輕便,解析速度快,簡單易用,非常適合在Android移動設備中使用,Android系統內部在解析各種XML時也是用PULL解析器。

這裏只介紹PULL解析方法的使用。步驟如下:

1、在項目的assets目錄中放置一個XML文檔provinceandcity.xml,內容如下:

<resources>
<province id="1" name="直轄市">
<item>
<id>1</id>
<name>北京</name>
</item>
<item>
<id>2</id>
<name>上海</name>
</item>
<item>
<id>3</id>
<name>天津</name>
</item>
<item>
<id>4</id>
<name>重慶</name>
</item>
</province>
<province id="2" name="廣東">
<item>
<id>5</id>
<name>廣州</name>
</item>
<item>
<id>6</id>
<name>深圳</name>
</item>
<item>
<id>7</id>
<name>珠海</name>
</item>
<item>
<id>8</id>
<name>汕頭</name>
</item>
<item>
<id>9</id>
<name>韶關</name>
</item>
<item>
<id>10</id>
<name>佛山</name>
</item>
<item>
<id>11</id>
<name>江門</name>
</item>
<item>
<id>12</id>
<name>湛江</name>
</item>
<item>
<id>13</id>
<name>茂名</name>
</item>
<item>
<id>14</id>
<name>肇慶</name>
</item>
<item>
<id>15</id>
<name>惠州</name>
</item>
<item>
<id>16</id>
<name>梅州</name>
</item>
<item>
<id>17</id>
<name>汕尾</name>
</item>
<item>
<id>18</id>
<name>河源</name>
</item>
<item>
<id>19</id>
<name>陽江</name>
</item>
<item>
<id>20</id>
<name>清遠</name>
</item>
<item>
<id>21</id>
<name>東莞</name>
</item>
<item>
<id>22</id>
<name>中山</name>
</item>
<item>
<id>23</id>
<name>潮州</name>
</item>
<item>
<id>24</id>
<name>揭陽</name>
</item>
<item>
<id>25</id>
<name>雲浮</name>
</item>
</province>
........
</resources>


2)創建一個City類,用於暫存xml中的數據,看一下City.java的代碼:

package com.example.provinceandcityforcn;


public class City {
    int cityId;
    int provinceId;
    String cityName;
    String provinceName;
    public int getCityId() {
        return cityId;
    }
    public void setCityId(int cityId) {
        this.cityId = cityId;
    }
    public int getProvinceId() {
        return provinceId;
    }
    public void setProvinceId(int provinceId) {
        this.provinceId = provinceId;
    }


    public String getProvinceName() {
        return provinceName;
    }
    public void setProvinceName(String provinceName) {
        this.provinceName = provinceName;
    }
    public String getCityName() {
        return cityName;
    }
    public void setCityName(String cityName) {
        this.cityName = cityName;
    }
}
3)PULL解析xml:

package com.example.provinceandcityforcn;


import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;


import android.content.res.XmlResourceParser;


import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import java.util.ArrayList;


/**
 * 解析XML,獲取城市
 *
 */
public class CityPullParse {


    public static ArrayList<City> Parse(String CityString){
        ArrayList<City> CityArray = new ArrayList<City>();


        try {
            //定義工廠 XmlPullParserFactory
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();


            //定義解析器 XmlPullParser
            XmlPullParser parser = factory.newPullParser();


            //獲取xml輸入數據
            parser.setInput(new StringReader(CityString));


            CityArray = ParseXml(parser);
        } catch (XmlPullParserException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return CityArray;
    }


    public static ArrayList<City> Parse(InputStream cityIS){
        ArrayList<City> cityArray = new ArrayList<City>();
        try {
            //定義工廠 XmlPullParserFactory
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();


            //定義解析器 XmlPullParser(要轉換爲XmlResourceParser,否則不能正常解析)
            XmlResourceParser parser =(XmlResourceParser) factory.newPullParser();            


            //獲取xml輸入數據
            parser.setInput(cityIS,"utf-8");


            cityArray = ParseXml(parser);
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        }


        return cityArray;
    }
    


    /**
     * @param parser
     * @return
     */
    public static ArrayList<City> ParseXml(XmlPullParser parser){
        ArrayList<City> CityArray = new ArrayList<City>();
        City CityTemp = null;
        int provinceId = 0;
        int cityId;
        String cityName;
        String provinceName = "";


        try {
            //開始解析事件
            int eventType = parser.getEventType();


            //處理事件,不碰到文檔結束就一直處理
            while (eventType != XmlPullParser.END_DOCUMENT) {
                //因爲定義了一堆靜態常量,所以這裏可以用switch
                switch (eventType) {
                    case XmlPullParser.START_DOCUMENT:
                        break;


                    case XmlPullParser.START_TAG:
                        //給當前標籤起個名字
                        String tagName = parser.getName();
                        if(tagName.equals("province")){
                            provinceId = Integer.parseInt(parser.getAttributeValue(null, "id"));//獲取province節點屬性爲id的值
                            //provinceId = Integer.parseInt(parser.getAttributeValue(0));//第二種方式(獲取province節點屬性爲id的值
                            provinceName = String.valueOf(parser.getAttributeValue(null, "name"));//獲取province節點屬性爲name的值
                        }else if(tagName.equals("item")){
                            CityTemp = new City();
                        }else if(tagName.equals("id")){
                            cityId = Integer.parseInt(parser.nextText());                            
                            parser.next();
                            cityName = parser.nextText();
                            
                            CityTemp.setProvinceId(provinceId);
                            CityTemp.setCityId(cityId);
                            CityTemp.setProvinceName(provinceName);
                            CityTemp.setCityName(cityName);
                            CityArray.add(CityTemp);
                        }
                        break;


                    case XmlPullParser.END_TAG:
                        break;
                    case XmlPullParser.END_DOCUMENT:
                        break;
                }


                //別忘了用next方法處理下一個事件,忘了的結果就成死循環#_#
                eventType = parser.next();
            }
        } catch (XmlPullParserException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


        return CityArray;
    }
}

4)UI調用:

(1)佈局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".CityActivity" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="50dip"
        android:gravity="center"
        android:orientation="horizontal"
        android:padding="5dip" >

        <Button
            android:id="@+id/btn_getcity"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="獲取城市列表" >
        </Button>
    </LinearLayout>
    <ScrollView
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_weight="1" >

        <TextView
            android:id="@+id/textview" 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="" >
        </TextView>
    </ScrollView>

</LinearLayout>


(2)代碼文件

package com.example.provinceandcityforcn;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;

import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.app.Activity;
import android.content.res.XmlResourceParser;

public class CityActivity extends Activity implements OnClickListener {

	private ArrayList<City> cityArray;
	private String cityStr;
	private TextView textview;
    private String fileName = "provinceandcity.xml";
	private XmlResourceParser provinceandcityParser;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_city);
		((Button)findViewById(R.id.btn_getcity)).setOnClickListener(this);
		textview=(TextView)findViewById(R.id.textview);
	}


	private void getcity(){
		provinceandcityParser = getXMLFromResXml(fileName);
		cityArray =CityPullParse.ParseXml(provinceandcityParser);
        //cityArray = CityPullParse.Parse(getInputStreamFromAssets(fileName));
        for(City city : cityArray){
            cityStr += "省份ID["+city.getProvinceId() + "],省份name["+city.getProvinceName() + "],城市ID[" + city.getCityId() +"], "+city.getCityName()+"\n";
        }
        textview.setText(cityStr);
	}
	
    public XmlResourceParser getXMLFromResXml(String fileName){
        XmlResourceParser xmlParser = null;
        try {    
            xmlParser = this.getResources().getXml(R.xml.provinceandcity);
            return xmlParser;
        } catch (Exception e) { 
            e.printStackTrace(); 
        }
        return xmlParser;
    }
	
	/**
	 * 從assets中讀取文件到InputStream中
	 */
    public InputStream getInputStreamFromAssets(String fileName){
        try {
            InputStream inputStream = getResources().getAssets().open(fileName);
            return inputStream;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		if (v.getId()==R.id.btn_getcity){
			getcity();
		}
	}
}

5)運行結果:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章