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

  • 相关阅读:
    Win10系统下安装Tensorflow
    基于theano的深度卷积神经网络
    卷积层和池化层
    ReLu(Rectified Linear Units)激活函数
    向上取整&向下取整
    物品选取
    猫狗大战
    田忌赛马
    魔术棋子
    回文字串
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/6784914.html
Copyright © 2020-2023  润新知