android pull xml,android开发:xml解析读取的方法XmlResourceParser、XmlPullParser

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的截图:

fb13beebb8234a06f1f8c92cfa6c6d0f.png

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;

}

}

效果截图:

38bec0c4fc0f94ed1e3e08bca4af78e1.png9584b3c0a8bbdbb93c096a64fc457bad.png

c5d2b6cbd5e3ba4d32daaf1e28881901.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值