利用pull解析XML檔案需要下面幾個步驟:
1)擷取XMLPullParser對象。這裡有兩個方法:通過XMLPullParserFactory擷取XMLPullParser對象,或者直接使用Xml.newPullParser()方法擷取。栗子如代碼一所示。
2)通過XMLPullParser對象設定輸入流。
3)通過parser.next(),持續的解析XML檔案直到檔案的尾部。
下面的幾個方法是經常需要的:XMLPullParserFacotry.newInstance( ) facotry.newPullParser( ) Xml.newPullParser() parser.setInput( ) parser.next( ).
注意: 1)parser.next()方法使指向下移一個最小元素。 舉個栗子: <title>靜夜思</title> 這這裡首先指向<title>,調用parser.next()後,會指向 靜夜思 ,再調用parser.next(),指向</title>。 2)我無論使用現有的xml檔案還是用xml字元串作為資料源,parser.nextText()方法皆不好使,會報XmlPullParserException。暫不知原因。 3)使用xml檔案做資料源時,使用parser.next()會報nullpointexception。不知道原因,猜測是格式有誤。 4)解析xml時,有以下方式: 方式一,判斷标簽類型。下面是栗子。
while (eventType != XmlPullParser.END_DOCUMENT) {
if (eventType == XmlPullParser.START_DOCUMENT) {
Log.d("tag", "StartDocument3--" + parser.getName());
}
if (eventType == XmlPullParser.START_TAG) {
Log.d("tag", "StartTag--" + parser.getName());
}
if (eventType == XmlPullParser.TEXT) {
Log.d("tag", "Text--" + parser.getText());
}
if (eventType == XmlPullParser.END_TAG) {
Log.d("tag", "EndTag--" + parser.getName());
}
方式二,判斷标簽name,下面是栗子。
while (eventType != XmlPullParser.END_DOCUMENT) {
Log.i("xml", "WhileBegin--");
if ("poem".equals(parser.getName())) {
Log.i("xml", "poem--" + parser.getName());
} else if ("title".equals(parser.getName())) {
Log.i("xml", "title--" + parser.getName());
} else if ("author".equals(parser.getName())) {
Log.i("xml", "author--" + parser.getName());
} else if ("content".equals(parser.getName())) {
Log.i("xml", "content--" + parser.getName());
}
方式三,兩者混合,本人比較推薦。
while (type != XmlPullParser.END_DOCUMENT) {
switch (type) {
case XmlPullParser.START_TAG:
Log.i("WeatherService", "StartTag");
if ("infos".equals(parser.getName())) {
weatherInfos = new ArrayList<WeatherInfo>();
} else if ("city".equals(parser.getName())) {
weatherInfo = new WeatherInfo();
String idStr = parser.getAttributeValue(0);
weatherInfo.setId(Integer.parseInt(idStr));
} else if ("name".equals(parser.getName())) {
type = parser.next();
String name = parser.getText();
weatherInfo.setName(name);
}
case XmlPullParser.TEXT:
Log.i("WeatherService", "XmlText");
break;
case XmlPullParser.START_DOCUMENT:
Log.i("WeatherService", "StartDoc");
break;
case XmlPullParser.END_TAG:
Log.i("WeatherService", "EndTag");
if ("city".equals(parser.getName())) {
weatherInfos.add(weatherInfo);
weatherInfo = null;
}
break;
}
代碼如下: 代碼一:使用字元串作為資料源
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
XmlPullParserFactory factory;// 1.第一步,建立解析工廠
factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true); // 設定支援命名空間
XmlPullParser parser = factory.newPullParser();// 2.生成parser對象
// 3.設定輸入
parser.setInput(new StringReader(
"<?xml version=\"1.0\" ?><poem><title>靜夜思</title><author>李白</author><content>床前明月光,疑似地上霜,舉頭忘明月,低頭思故鄉</content></poem>"));
int eventType = parser.getEventType();// 擷取輸入類型
while (eventType != XmlPullParser.END_DOCUMENT) {
if (eventType == XmlPullParser.START_DOCUMENT) {
Log.d("tag", "StartDocument3--" + parser.getName());
}
if (eventType == XmlPullParser.START_TAG) {
Log.d("tag", "StartTag--" + parser.getName());
}
if (eventType == XmlPullParser.TEXT) {
Log.d("tag", "Text--" + parser.getText());
}
if (eventType == XmlPullParser.END_TAG) {
Log.d("tag", "EndTag--" + parser.getName());
}
eventType = parser.next(); // 不斷的去更新
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
XmlPullParser parser = Xml.newPullParser(); // 1.生成parser對象
// 2.設定輸入
parser.setInput(new StringReader(
"<?xml version=\"1.0\" ?><poem><title>靜夜思</title><author>李白</author><content>床前明月光,疑似地上霜,舉頭忘明月,低頭思故鄉</content></poem>"));
int eventType = parser.getEventType();// 擷取輸入類型
while (eventType != XmlPullParser.END_DOCUMENT) {
Log.i("xml", "WhileBegin--");
if ("null".equals((String) parser.getName())) {
Log.i("xml", "null--" + parser.getName());
} else if ("poem".equals(parser.getName())) {
Log.i("xml", "poem--" + parser.getName());
//這裡使用getNext()方法會造成XmlPullParserException錯誤,原因不知
//Log.i("xml", "poemNextText--" + parser.nextText());
} else if ("title".equals(parser.getName())) {
Log.i("xml", "title--" + parser.getName());
} else if ("author".equals(parser.getName())) {
Log.i("xml", "author--" + parser.getName());
} else if ("content".equals(parser.getName())) {
Log.i("xml", "content--" + parser.getName());
}
eventType = parser.next(); // 不斷的去更新
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
代碼二:
public class WeatherService {
public static List<WeatherInfo> getWeatherInfos(InputStream iStream)
throws Exception {
XmlPullParser parser = Xml.newPullParser();
parser.setInput(new StringReader(
"<?xml version=\"1.0\" encoding=\"utf-8\"?><infos><city id=\"1\" ><name>上海</name><weather>多雲</weather><temp>20℃/30℃</temp><pm>80</pm><wind>1級 </wind></city><city id=\"2\" ><name>北京</name><weather>晴天</weather><temp>26℃/32℃</temp><pm>120</pm><wind>2級</wind></city><city id=\"3\" ><name>吉林</name><weather>小雨</weather><temp>14℃/25℃</temp><pm>60</pm><wind>2級</wind></city></infos>"));
List<WeatherInfo> weatherInfos = null;
WeatherInfo weatherInfo = null;
int type = parser.getEventType();
Log.i("parserType",String.valueOf(type));
Log.i("parserEndDoc",String.valueOf(XmlPullParser.END_DOCUMENT));
while (type != XmlPullParser.END_DOCUMENT) {
Log.i("WeatherService", "while");
switch (type) {
case XmlPullParser.START_TAG:
Log.i("WeatherService", "StartTag");
if ("infos".equals(parser.getName())) {
weatherInfos = new ArrayList<WeatherInfo>();
} else if ("city".equals(parser.getName())) {
weatherInfo = new WeatherInfo();
String idStr = parser.getAttributeValue(0);
weatherInfo.setId(Integer.parseInt(idStr));
} else if ("name".equals(parser.getName())) {
type = parser.next();
String name = parser.getText();
weatherInfo.setName(name);
} else if ("weather".equals(parser.getName())) {
type = parser.next();
String weather = parser.getText();
weatherInfo.setWeather(weather);
} else if ("temp".equals(parser.getName())) {
type = parser.next();
String temp = parser.getText();
weatherInfo.setTemp(temp);
} else if ("pm".equals(parser.getName())) {
type = parser.next();
String pm = parser.getText();
weatherInfo.setPm(pm);
} else if ("wind".equals(parser.getName())) {
type = parser.next();
String wind = parser.getText();
weatherInfo.setWind(wind);
}
case XmlPullParser.TEXT:
Log.i("WeatherService", "XmlText");
break;
case XmlPullParser.START_DOCUMENT:
Log.i("WeatherService", "StartDoc");
break;
case XmlPullParser.END_TAG:
Log.i("WeatherService", "EndTag");
if ("city".equals(parser.getName())) {
weatherInfos.add(weatherInfo);
weatherInfo = null;
}
break;
}
type = parser.next();
}
iStream.close();
return weatherInfos;
}
}
參考頁面 1) XML解析之PULL解析: http://my.oschina.net/summerpxy/blog/201911?fromerr=oxPjkR9r 2)pull解析和生成xml檔案 http://www.cnblogs.com/linjiqin/archive/2011/05/24/2055689.html