Pull模式解析原理:
與SAX解析器模擬相似,也提供了類似的事件驅動.使用parser.next()可以進入下一個元素並觸發相應事件。事件將作為數值代碼被發送,因此可以使用一個switch對感興趣的事件進行處理。當元素開始解析時,調用parser.nextText()方法可以獲取下一個Text類型元素的值。
Pull模式解析步驟:
1、 得到一個XmlPullParser對象這裡得到XMLPullParser對象的方式有兩種:
1)通過Xml這個工具類的.newPullParser()方式得到
2)通過XmlPullParserFactory工廠創建
//得到XmlPullParserFacotry工廠
- XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
-
- XmlPullParser xmlparser = factory.newPullParser();
2、 再根據XmlPullParser對象設置輸入流和編碼格式
- parser.setInput(inputStream, "UTF-8");
3、 然後循環遍歷所有的結點可以通過文檔開始的代碼來判斷讀入到哪個節點
關於xmlparser.getEventType()其值有:
Start_DOCUMENT:文檔開始
END_DOCUMENT:文檔結束
START_TAG:開始讀標簽
END_TAG:標簽結束
TEXT:所讀的是文本內容
一個簡單示例:
- import java.io.IOException;
- import java.io.StringReader;
- import org.xmlpull.v1.XmlPullParser;
- import org.xmlpull.v1.XmlPullParserException;
- import org.xmlpull.v1.XmlPullParserFactory;
- public class SimpleXmlPullApp{
- public static void main (String args[]) throws XmlPullParserException, IOException{
-
- XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
- factory.setNamespaceAware(true);
- XmlPullParser xpp = factory.newPullParser();
-
- xpp.setInput( new StringReader ( "<foo>Hello World!</foo>" ) );
-
- int eventType = xpp.getEventType();
-
- while (eventType != XmlPullParser.END_DOCUMENT) {
-
- if(eventType == XmlPullParser.START_DOCUMENT) {
-
- System.out.println("Start document");
-
- } else if(eventType == XmlPullParser.START_TAG) {
-
- System.out.println("Start tag "+xpp.getName());
-
- } else if(eventType == XmlPullParser.END_TAG) {
-
- System.out.println("End tag "+xpp.getName());
-
- } else if(eventType == XmlPullParser.TEXT) {
-
- System.out.println("Text "+xpp.getText());
-
- }
- eventType = xpp.next();
- }
- System.out.println("End document");
- }
- }
輸出結果:
Start document
Start tag foo
Text Hello World!
End tag foo
還是以上一節(http://www.linuxidc.com/Linux/2011-11/47140.htm)的例子:讀取XML文件裡的內容把這些內容構造成一個Person對象,然後讀取這個XML文檔裡內容將其Person對象添加到一個List集合裡
person.xml:
- <?xml version="1.0" encoding="UTF-8"?>
- <persons>
- <person id="23">
- <name>李明</name>
- <age>30</age>
- </person>
- <person id="20">
- <name>李向梅</name>
- <age>25</age>
- </person>
- </persons>