XML文件解析
最近在学习XML文件解析,记录下学习的过程,使用的是Pull,Pull是Android内置的一个处理XML文件格式的解析器,其他的解析器还有SAX和Dom等。
Pull简介
Pull是基于事件驱动型的解析方式,所谓事件我的理解是文档开始和结束,元素的开始和结束都是一个事件,然后遇到这样的事件就执行事件处理方法。Pull有以下的几种事件
START_DOCUMENT
START_TAG
END_TAG
END_DOCUMENT
TEXT
大致流程是从本地读出xml文件,然后使用pull方式从xml中解析出我们需要的数据。
使用Pull方式解析XML步骤
1. 首先需要在本地有xml文件.这里是在res目录下新建一个xml文件夹,然后将.xml文件发到这个文件夹。
2. 通过getResourcesd().getXml()方法读出xml文件到XmlResourceParser中,这里XmlResourceParse是一
个接口继承了AttributeSet和XmlPullParse接口。
XmlResourceParser xmlResourceParser = getResources().getXml(R.xml.xmltemp);
3. 获取事件,开始解析 判断是否已到文档结尾,如果没有直接跳到相应事件做逻辑处理,直到文档结束.
(下面的代码片段是解析xml格式的省市区/县)
try {
//获取当前事件
eventType = xrp.getEventType();
List<City>cities = null;
List<County>counties = null;
//判断是否已到文档尾部
while(eventType!=XmlResourceParser.END_DOCUMENT){
switch (eventType) {
//文档头部
case XmlResourceParser.START_DOCUMENT:
Log.e("TAG","解析开始....");
mChinaList = new ArrayList<>();
break;
//标签头
case XmlResourceParser.START_TAG:
Log.e("TAG","解析节点: "+xrp.getName());
if(xrp.getName().equals("province")){
prvoNodeName = xrp.getName();
province = new Province();
province.setId(xrp.getAttributeValue(0));
province.setName(xrp.getAttributeValue(1));
cities = new ArrayList<>();
province.setCities(cities);
mChinaList.add(province);
}else if (xrp.getName().equals("city")) {
cityNodeName = xrp.getName();
city = new City();
city.setId(xrp.getAttributeValue(0));
city.setName(xrp.getAttributeValue(1));
cities.add(city); //每解析出一个城市都加入到arraylist中
counties = new ArrayList<>();
city.setCounties(counties); //每一个城市又会有很多的县或区,新添加一个城市创建一个County集合加入City
}else if (xrp.getName().equals("county")) {
county = new County();
county.setId(xrp.getAttributeValue(0));
county.setName(xrp.getAttributeValue(1));
county.setWeatherCode(xrp.getAttributeValue(2));
counties.add(county);
}
break;
//标签尾
case XmlResourceParser.END_TAG:
Log.e("TAG","解析节点结束: "+xrp.getName());
break;
default:
break;
}
//转向下一个事件
eventType = xrp.next();
}
} catch (Exception e) {
e.printStackTrace();
}