本博客如需转载。请注明出处。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
今天要实现省份,城市。区的选择,到网络上百度了一下。发现非常多实现都是用的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架构的懒得弄了,自己搞定吧。