XmlResourceParser
先来说说XmlResourceParser,看名字应该就是用来读取APK内置的XML资源来使用的,解析的方法跟XmlPullParser是一样的,下面来看演示代码:
public Object parserXml(XmlResourceParser xml){
ArrayList _list = new ArrayList<>();//三维数组对象
ArrayList _city = new ArrayList<>(); //城市二维数组对象
areaInfo province = new areaInfo(); //省份对象
areaInfo city = new areaInfo(); //城市对象
try {
while (xml.getEventType() != XmlResourceParser.END_DOCUMENT){ //XML开始解析
String name = null;
if(xml.getEventType() == XmlResourceParser.START_TAG){ //标签开头
name = xml.getName();//标签的名字
if (name.trim().toLowerCase().equals("province")){ //省份查询
province = new areaInfo();
province.id = Integer.valueOf(xml.getAttributeValue(0));//id
province.pid = Integer.valueOf(xml.getAttributeValue(1));//pid
province.name = xml.getAttributeValue(2); //name
province.extend = new ArrayList<>();
}else if (name.trim().toLowerCase().equals("city")){ //地级市
city = new areaInfo();
city.id = -1;
city.pid = Integer.valueOf(xml.getAttributeValue(0));//CityID
city.name = xml.getAttributeValue(1); //City
city.extend = new ArrayList<>();
}else if (name.trim().toLowerCase().equals("piecearea")){ //区县
areaInfo area = new areaInfo();
area.id = -1;
area.pid = Integer.valueOf(xml.getAttributeValue(0));//PieceareaID
area.name = xml.getAttributeValue(1); //Piecearea
city.extend.add(area);//把区县加入地级市
}
}else if (xml.getEventType() == XmlResourceParser.END_TAG){ //标签结束
name = xml.getName();
if(name.toLowerCase().trim().equals("province")){ //省份标签结束,把城市加入到集合中
province.extend = _city;
_city = new ArrayList<>();
_list.add(province);
}else if (name.toLowerCase().trim().equals("city")){ //城市标签结束,把城市加入_city集合
_city.add(city);
}
}else if (xml.getEventType() == XmlResourceParser.TEXT){
//Log.d(TAG,"TEXT:"+xml.getText());
}
xml.next();//读取下一个标签
}
} catch (XmlPullParserException e) {
e.printStackTrace();
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
}
return _list;
}
我这边解析的是一个area.xml文件,这个文件是一个三级集合的对象,下面来看一下xml的截图:
areaInfo是一个简单的地区信息类,下面贴出这个类的源代码:
/**
* 一个简单的区域信息类,用来存放城市ID已经名字
*/
class areaInfo {
public int id = -1;
public int pid;
public String name;
public ArrayList extend;
public areaInfo(){
}
public int getId(){
return id;
}
public int getPid(){
return pid;
}
public String getName(){
return name;
}
public String toString(){
return "id:"+id+" pid:"+pid+" name:"+name;
}
}
这样就可以解析到了,关于xml的文件下载地址,可以戳这里。
XmlPullParser
XmlPullParser的解析方法也很简单,下面看一下代码:
public Object pullXml(InputStream is,String encod){
XmlPullParser xml = Xml.newPullParser(); //创建XmlPullParser对象
ArrayList _list = new ArrayList<>(); //创建三维数组集合对象
ArrayList _city = new ArrayList<>(); //创建一个城市列表对象,二维数组
areaInfo province = new areaInfo(); //省份储存对象
areaInfo city = new areaInfo(); //城市存储对象
try {
xml.setInput(is,encod); //设置输入的xml内容
while (xml.getEventType() != XmlPullParser.END_DOCUMENT){
String name = null;
if(xml.getEventType() == XmlPullParser.START_TAG){ //标签解析开始代码
name = xml.getName();//标签的名字
if (name.trim().toLowerCase().equals("province")){ //省份标签
province = new areaInfo();
province.id = Integer.valueOf(xml.getAttributeValue(0));//id
province.pid = Integer.valueOf(xml.getAttributeValue(1));//pid
province.name = xml.getAttributeValue(2); //name
province.extend = new ArrayList<>();
//Log.d(TAG,"START_TAG:"+xml.getAttributeValue(0)+" "+xml.getAttributeValue(1)+" "+xml.getAttributeValue(2));
}else if (name.trim().toLowerCase().equals("city")){ //城市标签
city = new areaInfo();
city.id = -1;
city.pid = Integer.valueOf(xml.getAttributeValue(0));//CityID
city.name = xml.getAttributeValue(1); //City
city.extend = new ArrayList<>();
}else if (name.trim().toLowerCase().equals("piecearea")){ //区县标签
areaInfo area = new areaInfo();
area.id = -1;
area.pid = Integer.valueOf(xml.getAttributeValue(0));//PieceareaID
area.name = xml.getAttributeValue(1); //Piecearea
city.extend.add(area);//把区县加入城市对象
}
}else if (xml.getEventType() == XmlPullParser.END_TAG){
name = xml.getName();
if(name.toLowerCase().trim().equals("province")){ //省份标签结束,把城市加入到集合中
province.extend = _city;
_city = new ArrayList<>();
_list.add(province);//加入集合
}else if (name.toLowerCase().trim().equals("city")){ //城市标签结束,把城市加入_city集合
_city.add(city);
}
}else if (xml.getEventType() == XmlPullParser.TEXT){
//Log.d(TAG,"TEXT:"+xml.getText());
}
//读取下一个标签
xml.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
}
return _list;
}
前台的操作代码:
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.but4:
Spinner spinner = (Spinner)findViewById(R.id.spinner);
xmlUtils xml = new xmlUtils(mContext);
final ArrayList list = (ArrayList) xml.parserXml(mContext.getResources().getXml(R.xml.area));
SpinnerAdapter adapter = new ArrayAdapter(mContext,R.layout.spinneritem,list);
int pro_1 = 0;
int city_1 = 0;
int area_1 = 0;
if(list != null){
for (areaInfo province : list){
Log.d(TAG,"A:"+province.toString());
pro_1++;
// for (areaInfo city2 : province.extend){
// Log.d(TAG,"B:"+city2.toString());
// city_1++;
// for (areaInfo area2 : city2.extend){
// area_1++;
// Log.d(TAG,"C:"+area2.toString());
// }
// }
}
}
spinner.setAdapter(adapter);
Log.i(TAG,"省:"+pro_1+"个 地级市:"+city_1+"个 区县:"+area_1+"个");
//添加监听事件
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView> adapterView, View view, int i, long l) {
Log.i(TAG,"i:"+i+" l:"+l+" ");
areaInfo info = list.get(i);
Log.i(TAG,"省份:"+info.name+" pid:"+info.pid+" id:"+info.id);
for (areaInfo test: info.extend){
Log.d(TAG,"Other A:"+test.toString());
for (areaInfo test2: test.extend){
Log.d(TAG,"Other B:"+test2.toString());
}
}
}
@Override
public void onNothingSelected(AdapterView> adapterView) {
}
});
break;
case R.id.but5:
InputStream in = null;
try {
in = new FileInputStream(new File(Environment.getExternalStorageDirectory()+"/area.xml"));
xmlUtils xml2 = new xmlUtils(mContext);
ArrayList list2 = (ArrayList) xml2.pullXml(in,"utf-8");
int pro_2 = 0;
int city_2 = 0;
int area_2 = 0;
if(list2 != null){
for (areaInfo province : list2){
Log.d(TAG,"A:"+province.toString());
pro_2++;
for (areaInfo city2 : province.extend){
Log.d(TAG,"B:"+city2.toString());
city_2++;
// for (areaInfo area2 : city2.extend){
// area_2++;
// Log.d(TAG,"C:"+area2.toString());
// }
}
}
}
Log.i(TAG,"省:"+pro_2+"个 地级市:"+city_2+"个 区县:"+area_2+"个");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
break;
default:
Log.i(TAG,"Nothing...");
break;
}
}
效果截图: