1. 程式人生 > >android讀取xml檔案來實現省份,城市,區的選擇

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