废话不说,直入主题。
1. xml文件的解析首先用到了xml文件,我们称之为数据源。既然是对这种数据源对象进行操作,那么我们就需要创建这么一个实体,用来存储单条信息所有属性。
2. 最主要的解析文件代码写在一个专门的文件WeatherService。创建一个返回值为数据集List的静态方法,还需要传递一个输入流参数要用来初始化解析器。
在初始化解析器之前,首先要创建一个解析器,即XmlPullParser的变量,但是不是new,而是使用了Xml类里面的newPullParser()方法。紧接着就是初始化解析器。
XmlPullParser parser = Xml.newPullParser();
//初始化解析器
parser.setInput(is, "GB2312");
然后创建获取当前时间类型的实例和存储天气信息的实体实例以及存储天气集合的list。
int type = parser.getEventType();
List<WeatherInfo> weatherInfos = null;
WeatherInfo weatherinfo = null;
开始while循环,判断每次扫描到的标签。
首先判断扫描到的是不是结束文档的标签,也就是说拿结束文档标签作为整个循环的条件。
里面是一个switch判断语句,分两种case,一种是开始标签,一种是结束标签。
而开始标签里又要进行if判断,如果是某个标签,执行某项操作。比如,首先解析到的就是全局开始标签,这时候需要给刚才创建的全局变量weatherInfos赋值。当扫描到单个天气信息的开始标签时,需要实现weatherInfo实例。当扫描到单条信息的某个属性值时执行赋值操作。
结束标签就很简单了,一般结束标签没有什么操作,但如果是单条信息的结束标签,我们就需要把刚存好的weatherInfo存储到list实例里去,同时把weatherInfo赋值null,清空内存。
最后在while循环里面还需要用解析器获取到下一个标签。
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;
}
break;
}
type=parser.next();
}
3.当这些工作做完之后,我们就可以在方法类里面调用解析xml文件的方法getWeatherInfo()了。因为要传递一个InputStream类型的参数,所以用到了这样一连串东西:
this.class.getClassLoader().getResourceAsStream("weather.xml")
this指的是当前类,而weather.xml文件正是在一开始就存在的有实际数据的数据源。
接着,创建StringBuffer的实例,因为返回值是list类型,所以我们需要循环。
最终的数据就全部存储在了StringBuffer类的实例里面。
List<WeatherInfo> list = WeatherService.getWeatherInfo(MainActivity.class.getClassLoader().getResourceAsStream("weather.xml"));
StringBuffer sb = new StringBuffer();
for(WeatherInfo w : list){
sb.append(w.toString());
sb.append("\n");
}
至此,如何生成xml文件和读取xml文件就全部学会了。
最近有一些事情需要办理,可能要耽搁学习了。没办法人生就是这样计划赶不上变化,而且,步入社会之后,我们做着很多不情愿做的事情,这也许就是生活。