xml資料解析 Pull解析方式 Pull是Android内置的xml解析器(在Android項目中使用Pull解析不需要導入jar包),Android内部的xml檔案的解析都使用了Pull解析器。Pull解析器的運作方式與SAX 解析器相似。它提供了類似的事件,如:開始元素和結束元素事件,使用parser.next()可以進入下一個元素并觸發相應事件。事件将作為數值代碼被發送,是以可以使用一個switch對感興趣的事件進行處理。當元素開始解析時,調用parser.nextText()方法可以擷取下一個Text類型節點的值。
得到一個XmlPullParser對象這裡得到XMLPullParser對象的方式有兩種: 1)通過Xml這個工具類的.newPullParser()方式得到(在Android工程中可以使用) 2)通過XmlPullParserFactory工廠建立
讀取到xml的聲明傳回數字0 START_DOCUMENT; 讀取到xml的結束傳回數字1 END_DOCUMENT ;
讀取到xml的開始标簽傳回數字2 START_TAG
讀取到xml的結束标簽傳回數字3 END_TAG 讀取到xml的文本傳回數字4 TEXT test.xml檔案 <? xml version = "1.0" encoding = "UTF-8" ?> < persons > < person id = "23" > < name > liming </ name > < age > 30 </ age > </ person > < person id = "20" > < name > lixiangmei </ name > < age > 25 </ age > </ person > </ persons > 解析的java檔案(建立的是java工程,是以需要導入xml2-2.3.0.jar,xmlpull_1_1_3_4c.jar,實體類Person省略,其中有id,name,age三個屬性,隻有setter和getter方法) package com.hngd.xmldemo;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream.GetField;
import java.io.OutputStream;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
public class XmlDemo {
public static void main(String[] args) {
XmlDemo xml = new XmlDemo();
FileInputStream in;
try {
in = new FileInputStream(new File("D:\\eclipseWorkSpace\\JsonDemo\\src\\com\\hngd\\xmldemo\\test2.xml"));
List<Person> list = xml.parseXml(in);
System.out.println(list.get(0));
System.out.println(list.get(1));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
private List<Person> parseXml(InputStream in){
List<Person> list = null;
Person person = null;
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();//擷取Pull解析工廠
XmlPullParser xmlPullparser = factory.newPullParser();//擷取XmlPullParser的執行個體
//XmlPullParser xmlPullparser = Xml.newPullParser(); //安卓工程中使用Xml工具擷取Pull解析器
xmlPullparser.setInput(in,"UTF-8"); // 設定需要解析的XML資料
int eventType = xmlPullparser.getEventType();
while(eventType != XmlPullParser.END_DOCUMENT){ //不是文檔的結尾
switch (eventType) {
case XmlPullParser.START_DOCUMENT: //1、文檔開始。如果為開始解析頭标簽START_DOCUMENT,初始化資料
list = new ArrayList<Person>();
break;
case XmlPullParser.START_TAG: //2、标簽開始。如果為開始解析屬性START_TAG,則擷取資料
String name = xmlPullparser.getName(); //目前指向元素的名稱(節點名稱)
if("person".equals(name)){
person = new Person();
person.setId(Integer.parseInt(xmlPullparser.getAttributeValue(0)));
}
if(person!=null){
if("name".equals(name)){
person.setName(xmlPullparser.nextText());
}
if("age".equals(name)){
person.setAge(Integer.parseInt(xmlPullparser.nextText()));
}
}
break;
case XmlPullParser.END_TAG: //3、标簽結束。當觸發xml文檔結束事件的名稱為person(即解析結束位置),将封裝對象放入集合,再将對象制空
if("person".equals(xmlPullparser.getName())){
list.add(person);
person = null;
}
break;
}
eventType = xmlPullparser.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return list;
} }