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地址,和资源。
地址例如以下:http://download.csdn.net/detail/jiguangcanhen/8152421
该项目为ant架构,gradle架构的懒得弄了,自己搞定吧。
android读取xml文件来实现省份,城市,区的选择的更多相关文章
- Android - 读取XML文件中的数据
读取XML中存储的数据.将xmlfile.xml存放在assets文件夹中.在activity_main.xml中创建一个textview,用来显示读取到的数据. XML文件内容如下:xmlfile. ...
- unity Android 打包后读取 xml 文件
原地址:http://www.cnblogs.com/wuzhang/p/wuzhang20140731.html 问题: 前天在做东西的过程中发现了一个让人很纠结的问题,为什么Unity 程序 ...
- Android 开发自己的网络收音机4——读取XML文件的电台数据
国内外的电台数据很多,起码有好几百,所以把这些数据都写到代码里面是不实际的.只能写成一个数据文件,程序启动的时候再去加载.保存这些简单数据,我们肯定会优先使用XML文件,今天讲讲如何读取XML里面的数 ...
- Android通过xml文件配置数据库
之前一段时间自己封装了两个数据库,一个是ORM数据库,另一个是事件流数据库,项目相应的地址如下: ORM数据库:https://github.com/wenjiang/SimpleAndroidORM ...
- cocos2dx中调用TinyXml读取xml配置文件 || cocos2d-x 中跨平台tinyxml读取xml文件方式
TiXmlDocument *doc = newTiXmlDocument; #if (CC_TARGET_PLATFORM ==CC_PLATFORM_ANDROID) //Android平台tin ...
- android解析xml文件的方式
android解析xml文件的方式 作者:东子哥 ,发布于2012-11-26,来源:博客园 在androd手机中处理xml数据时很常见的事情,通常在不同平台传输数据的时候,我们就可能使用xm ...
- C#中常用的几种读取XML文件的方法
1.C#中常用的几种读取XML文件的方法:http://blog.csdn.net/tiemufeng1122/article/details/6723764/
- 读取xml文件报错:Invalid byte 2 of 2-byte UTF-8 sequence。
程序读取xml文件后,系统报“Invalid byte 2 of 2-byte UTF-8 sequence”错误,如何解决呢? 1.程序解析xml的时候,出现Invalid byte 2 of 2- ...
- C#读取XML文件的基类实现
刚到新单位,学习他们的源代码,代码里读写系统配置文件的XML代码比较老套,直接写在一个系统配置类里,没有进行类的拆分,造成类很庞大,同时,操作XML的读写操作都是使用SetAttribute和node ...
随机推荐
- 51Nod - 1405 树的距离之和(树形DP)
1405 树的距离之和 题意 给定一棵无根树,假设它有n个节点,节点编号从1到n,求任意两点之间的距离(最短路径)之和. 分析 树形DP. 首先我们让 \(1\) 为根.要开两个数组 \(up \ d ...
- #421 Div1 C
#421 Div1 C 题意 在 (0, n) 和 (m, 0) 处各有一个装置,从起始点(0, 0)出发,首先走短路到 (m, 0) 拿起装置回到起始点,再去 (0, n) 处拿起装置回到起始点.当 ...
- Codevs1026 SEARCH(逃跑的拉尔夫 )(BFS)
SEARCH 时间限制: 1 Sec 内存限制: 128 MB提交: 11 解决: 4[提交][状态][讨论版] 题目描述 年轻的拉尔夫开玩笑地从一个小镇上偷走了一辆车,但他没想到的是那辆车属于警 ...
- 分享Kali Linux 2017年第23周镜像文件
分享Kali Linux 2017年第23周镜像文件 Kali Linux官方于6月4日发布2017年的第23周镜像.这次维持了11个镜像文件的规模.默认的Gnome桌面的4个镜像,E17.KDE. ...
- Java多线程中的异常处理
在java多线程程序中,所有线程都不允许抛出未捕获的checked exception,也就是说各个线程需要自己把自己的checked exception处理掉.这一点是通过java.lang.Run ...
- 一篇文章让你彻底弄懂WinForm GDI 编程基本原理
一 GDI编程原理 GDI(Graphics Device Interface,图形设备接口),主要负责Windows系统与绘图程序之间的信息交换,处理所有Windows程序的图形输出. GDI的常用 ...
- 输入法不能使用ctrl+shift进行切换的问题
第一种情况就是,你的输入法只有一种(而且这种输入法并不是“中文(简体) 微软拼音输入法”). 如果是只有一种输入法的话,是无法进行切换的,如果你是想要把输入法切换到无输入法状态,那么你可以通过设置任务 ...
- sql中用JOIN USING 简化JOIN ON
Mysql 中联接SQL语句中,ON子句的语法格式为:table1.column_name = table2.column_name. 当模式设计对联接表的列采用了相同的命名样式时,就可以使用 USI ...
- Java迭代器原理
1迭代器模式 迭代器是一种设计模式,这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示. 一般实现方式如下:(来自)
- hive bucket
转载:https://www.cnblogs.com/end/archive/2013/01/09/2852413.html hive中table可以拆分成partition,table和partit ...