今天给大家分享一下如何用Pull解析器解析Xml文件,下面以解析一个天气预报的信息为例
Pull解析器是Android本身自带的一个解析器,而且Android里面也有很多的Xml文件,同样也是用Pull解析器来解析的,Pull解析的机制和SAX解析很相似,都是基于事件的解析,不同的是Pull解析产生的是一个数字不是方法,下面来具体介绍一下Pull解析
一、Xml文件源码(天气信息)
<?xml version="1.0" encoding="utf-8"?>
<infos>
<city id="1">
<temp>23℃/30℃</temp>
<weather>5月20日 多云转阴</weather>
<wind>南风3-4级</wind>
<name>上海</name>
<pm>200</pm>
</city>
<city id="2">
<temp>23℃/30℃</temp>
<weather>5月20日 多云转阴</weather>
<wind>南风3-4级</wind>
<name>北京</name>
<pm>200</pm>
</city>
<city id="3">
<temp>23℃/30℃</temp>
<weather>5月20日 多云转阴</weather>
<wind>南风3-4级</wind>
<name>哈尔滨</name>
<pm>200</pm>
</city>
</infos>
二、天气信息的获取
因为在做天气预报的信息获取时,我们往往是直接从天气预报的网上暴露出的接口来获取的,下面我们把信息直接写在本地上
根据Xml文件可以看到有很多类型的信息,我们先定义后,再生成Getter和Setter方法,最后再生成toString的方法,因为最后我们需要显示在Textview上。
public class WeatherInfo {
private int id;
private String name;
private String wind;
private String weather;
private String temp;
private String pm;
@Override
public String toString() {
return " [城市id=" + id + ", 名称=" + name + ", 风力=" + wind
+ ", 天气=" + weather + ", 温度=" + temp + ", 雾霾=" + pm
+ "]";
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getWind() {
return wind;
}
public void setWind(String wind) {
this.wind = wind;
}
public String getWeather() {
return weather;
}
public void setWeather(String weather) {
this.weather = weather;
}
public String getTemp() {
return temp;
}
public void setTemp(String temp) {
this.temp = temp;
}
public String getPm() {
return pm;
}
public void setPm(String pm) {
this.pm = pm;
}
三、进行Pull解析
首先我们需要初始化Pull解析器,Pull解析产生的是一个数字,所以我们可以用switch方法来进行解析
XmlPullParser parser = Xml.newPullParser();
// 初始化解析器
parser.setInput(is, "utf-8");
List<WeatherInfo> weatherInfos = null;
WeatherInfo weatherInfo = null;
int type = parser.getEventType();
while (type != XmlPullParser.END_DOCUMENT) {
switch (type) {
case XmlPullParser.START_TAG:
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 ("temp".equals(parser.getName())) {
String temp = parser.nextText();
weatherInfo.setTemp(temp);
} else if ("weather".equals(parser.getName())) {
String weather = parser.nextText();
weatherInfo.setWeather(weather);
} else if ("wind".equals(parser.getName())) {
String wind = parser.nextText();
weatherInfo.setWind(wind);
} else if ("name".equals(parser.getName())) {
String name = parser.nextText();
weatherInfo.setName(name);
} else if ("pm".equals(parser.getName())) {
String pm = parser.nextText();
weatherInfo.setPm(pm);
}
break;
case XmlPullParser.END_TAG:
if ("city".equals(parser.getName())) {
//一个城市的信息已经处理完毕
weatherInfos.add(weatherInfo);
weatherInfo = null;
}
}
type = parser.next();
}
return weatherInfos;
is是一个输入流,然后定义一个int类型的type开始解析。
while (type != XmlPullParser.END_DOCUMENT)表示类型不是Xml输入流的末尾就向下执行。
parser.nextTexy()方法用来获取下一个Text类型节点值。
最后处理完一个城市后再从city节点来说循环。
四、显示天气信息
把xml文件放在str目录下后,通过类加载器来得到xml文件
最后遍历List<Weather Info>就可以得到所有的天气信息啦
List<WeatherInfo> infos = WeatherService.getWeatherInfos(MainActivity.class.getClassLoader()
.getResourceAsStream("weather.xml"));
StringBuffer sb = new StringBuffer();
for(WeatherInfo info: infos){
String str = info.toString();
sb.append(str);
sb.append("\n");
}
tv.setText(sb.toString());
Toast.makeText(this, "解析天气信息成功", Toast.LENGTH_SHORT).show();