利用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