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架構的懶得弄了,自己搞定吧。