学向勤中得,萤窗万卷书。这篇文章主要讲述android读取xml文件来实现省份,城市,区的选择相关的知识,希望能为你提供帮助。
本博客如需转载。请注明出处。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
今天要实现省份,城市。区的选择,到网络上百度了一下。发现非常多实现都是用的sqlite数据库,可是我这边为了保证和ios那边数据统一,仅仅要用那边的plist文件。也就是我们常说的xml文件。就想找一个网络上读取xml文件来实现的。发现基本没有,就算有。也是把所有的资源所实用数组列举出来,而不是实时读取。
网络上的实现:
1.利用sqlite訪问db数据库。
2.列举出全部的xml资源。
我的实现:
1.动态读取xml文件。
2.须要什么读取什么,假设获取了想要的资源。则停止读取。
3.异步读取。
改进:
1.读取的资源没有进行缓存。这个看详细需求吧。
2.代码实现算法能够进行优化。
【android读取xml文件来实现省份,城市,区的选择】3.xml文件结构能够优化,这个是ios那边直接给我的资源。可是看着非常无语,city.xml比較少,就直接手动改动了一下,area.xml文件比較多,就没改了。
建议:
这个博客仅仅是给大家提供了一个实现的思路,大家不好照搬,最好依据自己的需求来详细实现,最好是换一个结构更加合理的xml文件,在实现一个比較优秀的算法。切记,本博客仅仅是提供一个思路!~。~
city.xml的基本结构
< ?xml version="1.0" encoding="UTF-8"?> < array> < dict> < key> state< /key> < string> 北京< /string> < key> cities< /key> < array> < string> 通州< /string> < string> 房山< /string> < string> 昌平< /string> < string> 顺义< /string> < string> 怀柔< /string> < string> 大兴< /string> < string> 密云< /string> < string> 平谷< /string> < string> 延庆< /string> < string> 东城< /string> < string> 崇文< /string> < string> 西城< /string> < string> 朝阳< /string> < string> 宣武< /string> < string> 石景山< /string> < string> 丰台< /string> < string> 门头沟< /string> < string> 海淀< /string> < /array> < /dict> .... < /array>
1.读取城市的代码
/** * 获取省份数据列表 */ private List< String> getProvince(){ //结果存储 List< String> resultList = new ArrayList< String> (); //标记是否读取下一个节点的内容 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 = https://www.songbingjia.com/android/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< String> getCity(String provinceName){ //结果存储 List< String> resultList = new ArrayList< String> (); //标记是否读取下一个节点的内容 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 = https://www.songbingjia.com/android/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资源的基本结构
< ?xml version="1.0" encoding="UTF-8"?> < array> .... < dict> < key> areas< /key> < array> < string> 连山壮族瑶族自治县< /string> < string> 阳山县< /string> < string> 佛冈县< /string> < string> 清城区< /string> < string> 连南瑶族自治县< /string> < string> 清新县< /string> < string> 英德市< /string> < string> 连州市< /string> < /array> < key> city< /key> < string> 清远< /string> < /dict> ..... < /array>
1.读取区的代码
/** * 获取区列表 */ private List< String> getRegion(String citName){ //结果存储 List< String> resultList = new ArrayList< String> (); //标记是否读取下一个节点的内容 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 = https://www.songbingjia.com/android/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架构的懒得弄了,自己搞定吧。
推荐阅读
- Android攻城狮使用LogCat方式调试程序
- log4j emailEmailDailyRollingFileAppender
- leetCode(29):Happy Number
- Android攻城狮重新认识Toast
- [Android 4.4.4] 泛泰A850 三版通刷 Mokee4.4.4 KTU84P 20140626 RC2.2 by syhost
- Android攻城狮属性动画赏析
- HEVC代码学习1:TAppEncoder的main函数
- Android应用经典主界面框架之二:仿网易新闻clientCSDN client (Fragment ViewPager)
- 安卓TabHost+ViewPager+RadioGroup多功能模板整理