編輯:關於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();//所有元素解析完成進行打印工作
}
華為榮耀8怎麼購買教程 華為榮耀8配置介紹
華為榮耀87月19日上午10點08分,榮耀8將在線上線下同步開賣。很多華為手機的粉絲們都在等待,華為榮耀8真的配置是怎麼樣的呢?下文就讓小編給大家介紹華為榮
Android實現圖片壓縮示例代碼
核心思想是通過BitmapFactory.Options來縮放圖片,主要是用到了它的inSampleSize參數(采樣率)當inSampleSize為1的時候,采樣後的圖
Android View體系(十一)自定義ViewGroup
前言此前講了很多,終於可以講到這一節了,本文的例子是一個自定義的ViewGroup,左右滑動切換不同的頁面,類似一個特別簡化的ViewPager,這篇文章會涉及到這個系列
android增量更新
今天學習了一下增量更新,這個技術已經出現很長時間了,但是現實中,估計只有大廠才利用了這一技術在做產品!國內有些第三方服務平台,像友盟提供自動更新的服務,也是用的增量方式!