Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android解析本地XML文件(PULL)之省-市-區三級目錄

Android解析本地XML文件(PULL)之省-市-區三級目錄

編輯:關於Android編程

Android解析本地XML文件(PULL)之省-市-區三級目錄

PULL解析器運行方式與sax解析器很相似,它提供了類似的事件。如開始元素和結束元素,使用parse.next()可以進行下一個元素並且出發相應的時間,時間將作為代碼被發送,因此可以使用一個switch來對時間進行選擇,然後進行相應的處理。當開始解析元素的時候,調用parser.nextText()法官法可以獲得下一個Text類型的元素。

PULL Parser用一個順序的時間和標記序列來呈現文檔的元素(也就是說PULL Parser是通過順序來讀取XML文件中的數據的)
通過調用getEventType來確定當前的讀取事件
文檔讀取都是從START_DOCUMENT事件開始,到END_DOCUMENT事件結束
遍歷標記,只需要調用next即可遍歷下一個標記
調用getName可以提取每個標記的名稱
調用getNextText可以提取每組標記之間的文本信息

xml解析文件

我們需要解析的文件如下這裡僅僅截取了部分代碼粘貼上來,如下所示包含了省-市-區且該xml文件中的標記有諸多重復的地方這裡采用了棧結構來存儲結點:


        
            110000
            北京
            
                
                    110100
                    北京市
                    
                        
                            110101
                            東城區
                        
                        
                            110102
                            西城區
                        
                        
                            110105
                            朝陽區
                        
                        
                            110106
                            豐台區
                        
                        
                            110107
                            石景山區
                        
                        
                            110108
                            海澱區
                        
                        
                            110109
                            門頭溝區
                        
                        
                            110111
                            房山區
                        
                        
                            110112
                            通州區
                        
                        
                            110113
                            順義區
                        
                        
                            110114
                            昌平區
                        
                        
                            110115
                            大興區
                        
                        
                            110116
                            懷柔區
                        
                        
                            110117
                            平谷區
                        
                        
                            110228
                            密雲區
                        
                        
                            110229
                            延慶區
                        
                    
                
            
        
        

代碼示例

xml文件解析方式如下:
首先創建省得存儲類:這裡需要保存省得相關信息有名稱、ID、以及該省下的所有的市的信息。

public class provinces {
    //保存省名稱
    private String Provinces;
    //保存省ID
    private String Provinces_id;
    //保存省下面的所有市
    private List<citys> Provinces_city;

    public provinces() {
    }

    public provinces(String provinces, String provinces_id, List<citys> provinces_city) {
        Provinces = provinces;
        Provinces_id = provinces_id;
        Provinces_city = provinces_city;
    }

    public String getProvinces() {
        return Provinces;
    }

    public void setProvinces(String provinces) {
        Provinces = provinces;
    }

    public String getProvinces_id() {
        return Provinces_id;
    }

    public void setProvinces_id(String provinces_id) {
        Provinces_id = provinces_id;
    }

    public List<citys> getProvinces_city() {
        return Provinces_city;
    }

    public void setProvinces_city(List<citys> provinces_city) {
        Provinces_city = provinces_city;
    }
}

省完了,就該是市的信息了,這裡同樣我們需要市的名稱、ID、該城市下所有的區的信息:

public class citys {
    //保存市的名稱
    private String citys;
    //保存市的ID
    private String citys_id;
    //保存市下面的所有的區
    private List<areas> citys_areas;

    public citys() {
    }

    public citys(String citys, String citys_id, List<areas> citys_areas) {
        this.citys = citys;
        this.citys_id = citys_id;
        this.citys_areas = citys_areas;
    }

    public String getCitys() {
        return citys;
    }

    public void setCitys(String citys) {
        this.citys = citys;
    }

    public String getCitys_id() {
        return citys_id;
    }

    public void setCitys_id(String citys_id) {
        this.citys_id = citys_id;
    }

    public List<areas> getCitys_areas() {
        return citys_areas;
    }

    public void setCitys_areas(List<areas> citys_areas) {
        this.citys_areas = citys_areas;
    }
}

最後是區的相關信息,由於區是最後一級只包含了區名稱與區ID:

public class areas {

    private String areas;
    private String areas_id;

    public areas() {
    }

    public areas(String areas_id, String areas) {
        this.areas_id = areas_id;
        this.areas = areas;
    }


    public String getAreas() {
        return areas;
    }

    public void setAreas(String areas) {
        this.areas = areas;
    }

    public String getAreas_id() {
        return areas_id;
    }

    public void setAreas_id(String areas_id) {
        this.areas_id = areas_id;
    }
}

接下來我們開始解析xml文件了,這裡我把省市區的xml文件放在了本地的assets目錄下,相關的代碼說明在代碼裡面有詳細的注釋,如果不懂的話可以私信我:

private void parseXMLWithPull(StringBuilder stringBuilder) {
        try {
            //獲取XMLPull的解析對象
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            XmlPullParser xmlPullParser = factory.newPullParser();
            //將字節流傳送到解析器中
            xmlPullParser.setInput(new StringReader(stringBuilder.toString()));
            //記錄下當前的讀取事件
            int eventType = xmlPullParser.getEventType();
            //用來臨時記錄id和name
            String id = "";
            String name = "";
            //循環讀取文檔
            while (eventType != XmlPullParser.END_DOCUMENT) {
                //nodeName記錄下當前讀取的節點的名稱
                String nodeName = xmlPullParser.getName();
                switch (eventType) {
                    //根據讀取事件來判斷執行的操作
                    case XmlPullParser.START_DOCUMENT://開始文檔事件
                        //初始化棧,用來存放讀取到的節點的名稱,因為該文件中的名稱跟id的節點名稱是重復的
                        //所以筆者想到了這種辦法來控制判斷目前讀取的是哪一個類型的id和name,當然也有其他方法,讀者可以自行試試
                        stack = new Stack();
                        break;
                    case XmlPullParser.START_TAG://開始元素事件,凡是讀取到的是開始節點,該節點名稱就入棧
                        if ("root".equals(nodeName)) {//取得節點名稱並判斷
                            stack.push(nodeName);
                            Log.e("pullActivity", nodeName + "入棧");
                        } else if ("data".equals(nodeName)) {
                            stack.push(nodeName);
                            Log.e("pullActivity", nodeName + "入棧");
                        } else if ("item".equals(nodeName)) {
                            stack.push(nodeName);
                            Log.e("pullActivity", nodeName + "入棧");
                            if (stack.size() == 7) {//通過棧內存放的節點數量來判斷目前處於哪一個節點位置
                                dis_bean = new areas();
                            }if (stack.size() == 5) {
                                citys_bean = new citys();
                            } if (stack.size() ==3){
                                province_bean = new provinces();
                                Log.e("pullActivity", "創建province_bean");
                            }
                        } else if ("id".equals(nodeName)) {
                            id = xmlPullParser.nextText();
                            if (stack.size() == 7) {
                                dis_bean.setAreas_id(id);
                            }else if (stack.size()==5){
                                citys_bean.setCitys_id(id);
                            }else if (stack.size()==3){
                                province_bean.setProvinces_id(id);
                            }
                        } else if ("name".equals(nodeName)) {
                            name = xmlPullParser.nextText();
                            if (stack.size() == 7) {
                                dis_bean.setAreas(name);
                            }else if (stack.size()==5){
                                citys_bean.setCitys(name);
                            }else if (stack.size() ==3){
                                province_bean.setProvinces(name);
                            }
                        } else if ("city".equals(nodeName)) {
                            stack.push(nodeName);
                            Log.e("pullActivity", nodeName + "入棧");
                            CitysList = new ArrayList<>();
                        } else if ("district".equals(nodeName)) {
                            stack.push(nodeName);
                            Log.e("pullActivity", nodeName + "入棧");
                            DistrictList = new ArrayList<>();
                        }
                        break;
                    case XmlPullParser.END_TAG://結束元素事件,凡是讀取到結束節點則對應的開始元素節點出棧
                        Log.e("pullActivity", nodeName + "出棧");
                        if ("district".equals(nodeName)) {
                            stack.pop();
                            citys_bean.setCitys_areas(DistrictList);
                        } else if ("item".equals(nodeName)) {
                            stack.pop();
                            if (stack.size() == 6) {
                                DistrictList.add(dis_bean);
                            } else if (stack.size() == 4) {
                                CitysList.add(citys_bean);
                            } else if (stack.size() ==2){
                                Log.e("pullActivity", "Lists放入");
                                Lists.add(province_bean);
                            }
                        }else if ("city".equals(nodeName)){
                            stack.pop();
                            province_bean.setProvinces_city(CitysList);
                        }else if ("data".equals(nodeName)){
                            stack.pop();
                            Log.e("pullActivity", "Lists大小:"+Lists.size());
                            Log.e("pullActivity", "數據解析完成");
                        }else if ("root".equals(nodeName)){
                            stack.clear();
                        }
                        break;
                    default:
                        break;

                }
                eventType = xmlPullParser.next();//進入下一個元素並觸發相應事件   
            }
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        print();//所有元素解析完成進行打印工作
    }
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved