_045_Android_xml檔案解析器XmlPullParser
轉自https://www.cnblogs.com/GeekSeer/p/5981125.html,感謝作者的無私分享。
Pull解析與Sax一樣.都屬於事件驅動的解析方式.。相比Sax解析過程更加靈活.
sax一旦開始解析就是從頭讀到尾.不解析完整個文件不會停。
pull解析較為靈活.是以事件為單位.手動向下繼續. 如果獲得到我們要找的內容. 可以停止繼續解析.
物件的種類
Document 整個xml文件物件
Element 文件中的標籤物件
Atritube 標籤中的屬性物件
Text 標籤體的內容的物件
Common 註釋物件
常用事件
START_DOCUMENT 文件開始
END_DOCUMENT 文件結束
START_TAG 元素開始
END_TAG 元素結束
常用方法
1.xml解析獲得標籤屬性值:
String number = parser.getAttributeValue(0); //通過索引獲取 這邊只有一個屬性number
String number =parser.getAttributeValue(null,"cityname"); //null:固定值;cityname:屬性的名字
2.獲得開始標籤之後的標籤體內容
if("name".equals(parser.getName())){ //解析到了name開始標籤就獲取值
String name = parser.nextText(); //xml解析獲得文字屬性parser.nextText(); 注意:這邊if條件中獲取的是name標籤開始的位置 因此用nextText()方法獲取標籤體內容
stu.setName(name);
}
public class PullTool {
//寫一個解析XML檔案的方法
/**
* 返回值:List<Student>
* 引數:InputStream is
* 注意 工具類中的方法寫成靜態
* @throws XmlPullParserException
*/
public static List<Student> parserXml(InputStream is) throws Exception{
//A.初始化集合以及Student物件
List<Student> list = null;
Student stu = null;
//B.建立生產XML的pull解析器的工廠
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
//C.使用工廠獲取pull解析器
XmlPullParser parser = factory.newPullParser();
//D.使用解析器讀取當前的xml流
parser.setInput(is, "UTF-8");
//傳入InputStream物件 並且設定解碼規則需和XML文件中設定的一致
//E.獲取當前事件的狀態
int type = parser.getEventType();
/**
* 我們知道pull解析是以事件為單位解析
的因此我們要獲取一開始的解析標記type,之後通過type判斷迴圈來讀取文件
* 注意:當解析器開始讀取is的時候已經開
始了,指標type在xml的第一行開始。pull解析是指標從第一行
開始讀取到最後一行以事件為單位讀取的解析方式
*/
//F.通過while迴圈判斷是否讀取到了文件結束
while(type != parser.END_DOCUMENT){
switch (type) {
case XmlPullParser.START_TAG:
//判斷當前遇到的元素名稱是否為students
if("students".equals(parser.getName())){
list = new ArrayList<Student>();
}else if("student".equals(parser.getName())){
//初始化Student物件
stu = new Student();
//讀取number屬性
String number = parser.getAttributeValue(null,"number");
//String number = parser.getAttributeValue(0);
//也可以通過索引獲取 這邊只有一個屬性number
//xml解析獲得標籤屬性值:parser.getAttributeValue(null,"cityname")
//null:固定值;cityname:屬性的名字
stu.setNumber(number); //將資料封裝到學生類中
}else if("name".equals(parser.getName())){
String name = parser.nextText();
//xml解析獲得文字屬性
//parser.nextText();
注意:這邊if條件中獲取的是name標籤開始的位置
//因此用nextText()方法獲取標籤體內容
stu.setName(name);
}else if("sex".equals(parser.getName())){
String sex = parser.nextText();
stu.setSex(sex);
}else if("age".equals(parser.getName())){
int age = Integer.parseInt(parser.nextText());
stu.setAge(age);
}
break;
case XmlPullParser.END_TAG:
if("student".equals(parser.getName())){
list.add(stu);
stu = null;
}
break;
default:
break;
}
//讓解析器向下解析一行,並返回改行的事件常量
// 這樣配合while(type != parser.END_DOCUMENT)讀取完整個文件
type = parser.next();
}
return list;
}
public static void main(String[] args) throws Exception {
FileInputStream is = new FileInputStream("src/stu.xml");
List<Student> list = PullTool.parserXml(is);
System.out.println(list);
is.close();
}
}
//使用Xml pull 解析器去解析 xml 檔案的內容
XmlPullParser xmlPullParser = Xml.newPullParser();
try {
//解析的源是什麼?- - - result.xml
InputStream in = getAssets().open("result.xml");
xmlPullParser.setInput(in,"utf-8");
//獲得一個事件型別
int eventType = xmlPullParser.getEventType();
//準備Product類的一個例項,去封裝資料
Product p =null;
while (eventType!=XmlPullParser.END_DOCUMENT){
if(eventType==XmlPullParser.START_TAG){
//判斷是否是元素的開始,只要是某個元素的開始位置,那麼就會進入這裡
//獲得當前解析到的元素的名稱
if("product".equals(xmlPullParser.getName())){
p = new Product();
String type = xmlPullParser.getAttributeValue(0);
p.setType(type);
}else if("phonenum".equals(xmlPullParser.getName())){
String number = xmlPullParser.nextText();
p.setNumber(number);
}else if("location".equals(xmlPullParser.getName())){
String location = xmlPullParser.nextText();
p.setLocation(location);
}else if("phoneJx".equals(xmlPullParser.getName())){
String phoneJx = xmlPullParser.nextText();
p.setPhoneJx(phoneJx);
System.out.println(p);
}
}
eventType=xmlPullParser.next();
}
} catch (IOException e) {
e.printStackTrace();
} catch (XmlPullParserException e) {
e.printStackTrace();
}