Pull解析Xml文件

今天给大家分享一下如何用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();


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值