解析XML文檔的方法是很多的,除了常用的SAX和DOM方法以外,還可以使用Java內建的Pull來解析XML文檔。
1.使用Pull解析器解析XML文檔
Pull解析器的運行方式和SAX解析器很相似,它提供了類似的事件,比如文檔開始、文檔結束、開始元素和結束元素等。使用parser.next()方法可以進入下一個元素並觸發相應的事件。各種事件均已數位形式被發送,因此可以在程式中使用一個switch語句來對事件進行選擇,然後進行相應的事件處理。
1.1事件類型
Pull解析器提供的事件類型總共有5種,分別如下:
(1)START_DOCUMENT 文檔開始
(2)START_TAG 開始元素
(3)TEXT 文本
(4)END_TAG 結束元素
(5)END_DOCUMENT 文檔結束
1.2常用方法
使用Pull解析器XmlPullParser解析XML文檔時,主要會用到以下幾個常用方法。
(1)int getAttributeCount(); //擷取當前元素的屬性個數
(2)String getAttributeValue(int index); //擷取屬性值
(3)int getEventType(); //擷取事件類型
(4)String getName(); //用於START_TAG和END_TAG事件中,擷取當前元素的名字
(5)int next(); //處理下一個元素
(6)int nextText(); //用於START_TAG事件中,獲得下一個TEXT類型的元素
1.3建立Pull解析器
可以通過以下兩個步驟建立一個Pull解析器。
(1)通過調用XmlPullParserFactory工廠類的newInstance()方法,建立一個Pull解析器工廠對象。
(2)通過調用Pull解析器工廠對象的newPullParser()方法,建立一個Pull解析器對象。
建立好了Pull解析器對象之後,就可以通過調用Pull解析器對象的setInput()方法傳入想要解析的XML文檔了。其中,setInput()方法提供了兩種重載的形式,分別為:
(1)void setInput(Reader in);
(2)void setInput(InputStream inputStream, String inputEncoding);
1.4執行個體
如下的代碼使用Pull解析器對上兩篇博文中提到的“person.xml”文檔進行瞭解析,提取出了XML文檔中的person資訊,並儲存到了Person對象列表。
1 /* 2 * Function : 使用Pull解析器解析XML文檔 3 * Param : inputStream 以輸入資料流的形式傳入XML文檔 4 * inputEncoding XML文檔的編碼格式 5 * Retuen : List<Person> Person對象列表 6 * Author : 部落格園-依舊淡然 7 */ 8 public static List<Person> readXML(InputStream inputStream, String inputEncoding) throws Exception { 9 10 List<Person> list = null; //儲存解析得到的所有Person對象11 Person person = null; //儲存解析得到的單個Person對象12 13 XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); //建立Pull解析器工廠14 XmlPullParser xmlPullParser = factory.newPullParser(); //建立Pull解析器15 xmlPullParser.setInput(inputStream, inputEncoding); //以輸入資料流的形式傳入所要解析的XML文檔16 17 int eventType = xmlPullParser.getEventType(); //擷取事件類型18 while(eventType != XmlPullParser.END_DOCUMENT) { 19 switch(eventType) {20 case XmlPullParser.START_DOCUMENT: //文檔開始21 list = new ArrayList<Person>();22 break;23 case XmlPullParser.START_TAG: //開始元素24 if(xmlPullParser.getName().equals("person")) {25 person = new Person();26 int id = Integer.parseInt(xmlPullParser.getAttributeValue(0)); //擷取元素的屬性值27 person.setId(id);28 } else if(xmlPullParser.getName().equals("name")) {29 String name = xmlPullParser.nextText(); //擷取元素的內容30 person.setName(name);31 } else if(xmlPullParser.getName().equals("age")) {32 int age = Integer.parseInt(xmlPullParser.nextText());33 person.setAge(age);34 }35 break;36 case XmlPullParser.END_TAG: //結束元素37 if(xmlPullParser.getName().equals("person")) {38 list.add(person);39 person = null;40 }41 break;42 }43 eventType = xmlPullParser.next(); //產生迴圈,遍曆所有元素44 }45 return list;46 }
需要注意的一點是,使用Pull解析器時,需要在工程中匯入kxml2-2.2.2.jar包。