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(); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |