您的位置:首页 > 移动开发 > Android开发

android读取xml文件来实现省份,城市,区的选择

2014-11-13 10:17 411 查看
本博客如需转载,请注明出处。

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

今天要实现省份,城市,区的选择,到网络上百度了一下,发现很多实现都是用的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架构的懒得弄了,自己搞定吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: