什麼是pull解析
——- pull解析xml檔案,和sax和dom一樣 都可以脫離android單獨使用,pull和sax的原理一樣,不一樣的地方是pull讀取xml檔案後調用方法傳回的是數字
- xml的聲明傳回數字0: START_DOCUMENT
- xml的結束傳回數字1: END_DOCUMENT
- xml的開始标簽傳回數字2: START_TAG
- xml的結束标簽傳回數字3: END_TAG
-
xml的文本傳回數字4: TEXT
說明了pull每個辨別都是事件,它采用的就是事件驅動
直接上代碼 :
對下面這個xml進行pull解析
<?xml version="1.0" encoding="utf-8"?>
<PlayList>
<media id = "0" day = "00">
<type>0</type>
<name>江南</name>
<path>E:\dotnet\TestWinApp\TestWinApp\music\江南.mp3</path>
</media>
<media id = "1" day = "11">
<type>1</type>
<name>新不了情-015</name>
<path>F:\電視劇\新不了情\新不了情-015.rmvb</path>
</media>
<media id = "2" day = "22">
<type>2</type>
<name>新不了情-016</name>
<path>F:\電視劇\新不了情\新不了情-016.rmvb</path>
</media>
</PlayList>
可以看到,我們對javaBean來進行儲存
先建立一個play.java對象
public class Play {
private int id;
private int day;
private String name;
private int type;
private String path;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
@Override
public String toString() {
return "Play{" +
"id=" + id +
", day=" + day +
", name='" + name + '\'' +
", type=" + type +
", path='" + path + '\'' +
'}';
} //重寫toString 是為了列印驗證的
}
解析步驟:
1. 建立pull工廠類
2. 通過工廠類,建立pull解析器
3. 設定xml檔案來源,也可以設定編碼
4. 進行事件一個一個分析
5. 在分析的過程中,進行對bean對象建立
6. 列印驗證
private static void xmlPullParserDemo() {
List<Play> list = null;
try {
//建立pull工廠類 并 建立解析器,鍊式程式設計
XmlPullParser pullParser = XmlPullParserFactory.newInstance().newPullParser();
//設定檔案來源,也可以設定編碼
pullParser.setInput(new FileReader("E:\\CodeDemo\\HttpUrlConnection\\paly.xml"));
int type = pullParser.getEventType();
Play p = null;
//進行事件一個一個分析
while (type != XmlPullParser.END_DOCUMENT) {
String nodeName = pullParser.getName();
switch (type) {
case XmlPullParser.START_DOCUMENT:
list = new ArrayList<>();
break;
case XmlPullParser.START_TAG:
{
switch (nodeName) {
case "media":
p = new Play();
int count = pullParser.getAttributeCount();
for (int i = ; i < count; i++) {
String name = pullParser.getAttributeName(i);
String value = pullParser.getAttributeValue(i);
if(name.equals("id")) {
p.setId(Integer.parseInt(value));
} else {
p.setDay(Integer.parseInt(value));
}
}
break;
case "type":
p.setType(Integer.parseInt(pullParser.nextText()));
break;
case "name":
p.setName(pullParser.nextText());
break;
case "path":
p.setPath(pullParser.nextText());
break;
}
} break;
case XmlPullParser.END_TAG:
if (nodeName.equals("media")) {
list.add(p);
}
break;
}
//在分析的過程中,進行對bean對象建立
type = pullParser.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
for (int i = ; i < list.size(); i++) {
System.out.println(list.get(i));
//列印驗證
}
}
注意:
1. int type = pullParser.getEventType(); 這個是獲得事件類型,要不停的後移,别忘記 type = pullParser.next();
2. String nodeName = pullParser.getName(); 是擷取節點名,僅僅是擷取名,不是值
3. 這個是pullParser.nextText()擷取值的,而不是getText();
4. 最後一個,别忘記了,文章開始的那幾個tag, 0,1,2是做什麼的