android读取xml文件来实现省份,城市,区的选择
本博客如需转载,请注明出处。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
今天要实现省份,城市,区的选择,到网络上百度了一下,发现很多实现都是用的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的基本结构
<?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 = 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 = 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 = 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地址,和资源。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。