編輯:關於Android編程
PULL解析器運行方式與sax解析器很相似,它提供了類似的事件。如開始元素和結束元素,使用parse.next()可以進行下一個元素並且出發相應的時間,時間將作為代碼被發送,因此可以使用一個switch來對時間進行選擇,然後進行相應的處理。當開始解析元素的時候,調用parser.nextText()法官法可以獲得下一個Text類型的元素。
PULL Parser用一個順序的時間和標記序列來呈現文檔的元素(也就是說PULL Parser是通過順序來讀取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();//所有元素解析完成進行打印工作 }
華為榮耀87月19日上午10點08分,榮耀8將在線上線下同步開賣。很多華為手機的粉絲們都在等待,華為榮耀8真的配置是怎麼樣的呢?下文就讓小編給大家介紹華為榮
核心思想是通過BitmapFactory.Options來縮放圖片,主要是用到了它的inSampleSize參數(采樣率)當inSampleSize為1的時候,采樣後的圖
前言此前講了很多,終於可以講到這一節了,本文的例子是一個自定義的ViewGroup,左右滑動切換不同的頁面,類似一個特別簡化的ViewPager,這篇文章會涉及到這個系列
今天學習了一下增量更新,這個技術已經出現很長時間了,但是現實中,估計只有大廠才利用了這一技術在做產品!國內有些第三方服務平台,像友盟提供自動更新的服務,也是用的增量方式!