博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android读取xml文件来实现省份,城市,区的选择
阅读量:6229 次
发布时间:2019-06-21

本文共 7123 字,大约阅读时间需要 23 分钟。

本博客如需转载。请注明出处。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

今天要实现省份,城市。区的选择,到网络上百度了一下。发现非常多实现都是用的sqlite数据库,可是我这边为了保证和ios那边数据统一,仅仅要用那边的plist文件。也就是我们常说的xml文件。就想找一个网络上读取xml文件来实现的。发现基本没有,就算有。也是把所有的资源所实用数组列举出来,而不是实时读取。

网络上的实现:

1.利用sqlite訪问db数据库。

2.列举出全部的xml资源。

我的实现:

1.动态读取xml文件。

2.须要什么读取什么,假设获取了想要的资源。则停止读取。

3.异步读取。

改进:

1.读取的资源没有进行缓存。这个看详细需求吧。

2.代码实现算法能够进行优化。

3.xml文件结构能够优化,这个是ios那边直接给我的资源。可是看着非常无语,city.xml比較少,就直接手动改动了一下,area.xml文件比較多,就没改了。

建议:

这个博客仅仅是给大家提供了一个实现的思路,大家不好照搬,最好依据自己的需求来详细实现,最好是换一个结构更加合理的xml文件,在实现一个比較优秀的算法。切记,本博客仅仅是提供一个思路!~。~

city.xml的基本结构

state
北京
cities
通州
房山
昌平
顺义
怀柔
大兴
密云
平谷
延庆
东城
崇文
西城
朝阳
宣武
石景山
丰台
门头沟
海淀
....
1.读取城市的代码

/**	 * 获取省份数据列表	 */	private List
getProvince(){ //结果存储 List
resultList = new ArrayList
(); //标记是否读取下一个节点的内容 boolean nextRead = false; try { XmlPullParser xrpCity = Xml.newPullParser(); xrpCity.setInput(getAssets().open("city.xml"), "UTF-8"); while (xrpCity.getEventType() != XmlPullParser.END_DOCUMENT) { //假设是開始标签 if (xrpCity.getEventType() == XmlPullParser.START_TAG) { //获取标签名称 String name = xrpCity.getName(); //推断标签名称是否等于friend if("key".equals(name)){ xrpCity.next(); String value = xrpCity.getText(); if("state".equals(value)){ nextRead = true; } }else if("string".equals(name) && nextRead){ xrpCity.next(); resultList.add(xrpCity.getText()); nextRead = false; } } //下一个标签 xrpCity.next(); } } catch (XmlPullParserException e) { // TODO Auto-generated catch block e.printStackTrace(); resultList = null; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); resultList = null; } return resultList; }
2.读取城市的代码

/**	 * 获取城市列表	 */	private List
getCity(String provinceName){ //结果存储 List
resultList = new ArrayList
(); //标记是否读取下一个节点的内容 boolean nextRead = false; //读取城市节点内容的标记 boolean readCity = false; try { XmlPullParser xrpCity = Xml.newPullParser(); xrpCity.setInput(getAssets().open("city.xml"), "UTF-8"); while (xrpCity.getEventType() != XmlPullParser.END_DOCUMENT) { //假设是開始标签 if (xrpCity.getEventType() == XmlPullParser.START_TAG) { //获取标签名称 String name = xrpCity.getName(); if("key".equals(name)){ xrpCity.next(); String value = xrpCity.getText(); if("state".equals(value)){ nextRead = true; if(readCity){ break; } readCity = false; } }else if("string".equals(name) && nextRead){ xrpCity.next(); nextRead = false; if(provinceName.equals(xrpCity.getText())){ readCity = true; } }else if("string".equals(name) && readCity){ xrpCity.next(); resultList.add(xrpCity.getText()); } } //下一个标签 xrpCity.next(); } } catch (XmlPullParserException e) { // TODO Auto-generated catch block e.printStackTrace(); resultList = null; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); resultList = null; } return resultList; }
area.xml资源的基本结构

....
areas
连山壮族瑶族自治县
阳山县
佛冈县
清城区
连南瑶族自治县
清新县
英德市
连州市
city
清远
.....

1.读取区的代码

/**	 * 获取区列表	 */	private List
getRegion(String citName){ //结果存储 List
resultList = new ArrayList
(); //标记是否读取下一个节点的内容 boolean nextRead = false; //读取城市节点内容的标记 boolean readCity = false; try { XmlPullParser xrpCity = Xml.newPullParser(); xrpCity.setInput(getAssets().open("area.xml"), "UTF-8"); while (xrpCity.getEventType() != XmlPullParser.END_DOCUMENT) { //假设是開始标签 if (xrpCity.getEventType() == XmlPullParser.START_TAG) { //获取标签名称 String name = xrpCity.getName(); if("key".equals(name)){ xrpCity.next(); String value = xrpCity.getText(); if("areas".equals(value)){ nextRead = true; readCity = false; }else if("city".equals(value)){ readCity = true; nextRead = false; } }else if("string".equals(name) && nextRead){ xrpCity.next(); resultList.add(xrpCity.getText()); }else if("string".equals(name) && readCity){ xrpCity.next(); if(citName.equals(xrpCity.getText())){ break; }else{ resultList.clear(); } } } //下一个标签 xrpCity.next(); } } catch (XmlPullParserException e) { // TODO Auto-generated catch block e.printStackTrace(); resultList = null; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); resultList = null; } return resultList; }

上面就是基本的实现,待会把功能做个小项目,传到csdn之后。在给出demo地址,和资源。

地址例如以下:http://download.csdn.net/detail/jiguangcanhen/8152421

该项目为ant架构,gradle架构的懒得弄了,自己搞定吧。

你可能感兴趣的文章
IOS适配
查看>>
WhyDX9:翻写D3D红龙书中的程序
查看>>
RFC 4627 JSON
查看>>
UML类图
查看>>
Flex父子窗体相互调用
查看>>
AP_应付模组在月结的处理
查看>>
javascript如何判断访问网页的设备及是否支持触屏功能
查看>>
MFC 虚函数与消息映射区别
查看>>
每日一小练——列出全部子集
查看>>
[再寄小读者之数学篇](2014-06-23 Bernstein's inequality)
查看>>
微信公众平台开发(98) UnionID
查看>>
《CLR via C#》读书笔记 之 线程基础
查看>>
Linux中的lo回环接口详细介绍
查看>>
玩转Web之servlet(三)---一张图看懂B/S架构
查看>>
Neutron中的Service类
查看>>
MCU开发之I2C通信
查看>>
angular学习笔记(二十七)-$http(5)-使用$http构建RESTful架构
查看>>
阿里集团2015届校园招聘内推
查看>>
Android 面试精华题目总结
查看>>
SQL函数简述
查看>>