解析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)運行結果: