原理:
类似与sax解析,是基于事件的xml解析方式。
Pull解析器刚开始定位在文档的开始,pull解析器可以获取到当前事件类型,根据事件类型做相应的操作,通过解析器的next方法将游标定位到下一个节点位置。
我们可以通过不同节点事件类型去获取到xml文件中的数据封装到bean对象,将bean对象封装到集合,完成相应的业务需求。
代码实例:
1.获取pull解析器对象
2.获取节点事件类型
3.通过循环遍历xml文件,如果节点时间类型不是文档末尾时,不停的进行向下遍历。
4.遍历过程中将获取到的数据封装到bean实体,最终封装到集合中,作为结果返回给调用者。
Xml文件
<?xml version="1.0" encoding="UTF-8"?>
<citys>
<city id='1'>
<name>北京</name>
<weather>晴</weather>
<wind>7级</wind>
<temp>25</temp>
</city>
<city id='2'>
<name>天津</name>
<weather>晴</weather>
<wind>5级</wind>
<temp>20</temp>
</city>
<city id='1'>
<name>南京</name>
<weather>晴</weather>
<wind>3级</wind>
<temp>30</temp>
</city>
</citys>
解析xml文件
public List<CityInfo> pullParse() throws Exception{
//定义集合用来存放city实体
List<CityInfo> cityInfos = null;
//获取xml解析器对象
XmlPullParser parser = Xml.newPullParser();
//初始化参数
InputStream inputStream = StoreData.class.getClassLoader().getResourceAsStream("weather.xml");
parser.setInput(inputStream, "utf-8");
//获取节点事件类型
int type = parser.getEventType();
//定义临时实体,用来存放获取到的实体信息,并将每一个实体存储到集合中去
CityInfo cityInfo = null;
while(type!=XmlPullParser.END_DOCUMENT) {//如果当前节点事件类型不是文档结束
switch(type) {
case XmlPullParser.START_TAG:
if("cityes".equals(parser.getName())) {//如果节点名称是cityes说明获取到根节点,创建集合对象准备存储bean实体
cityInfos = new ArrayList<CityInfo>();
}else if("city".equals(parser.getName())){//如果节点名称是city说明获取到某个城市节点,为定义的临时对象赋值
}else if("weather".equals(parser.getName())) {//如果读取到weather节点,设置citiyInfo的weather属性
}
break;
case XmlPullParser.END_TAG:
if("city".equals(parser.getName())) {//如果读取到city结束标签,将cityInfo对象添加到集合中
cityInfos.add(cityInfo);
}
break;
}
type = parser.next();
}
//解析完成后将集合返回给调用者
return cityInfos;
}