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地址,和资源。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。