XML檔案內容如下(名字為"teacher.xml") zhangsan 1912000 lisi 23 8000使用Pangsan 1912000 lisi 23 8000使用Pangsan 1912000 lisi 23 8000使用PULLULL解析XML文件的程式碼:
import java.io.FileReader; import java.io.IOException; 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 PullTry { public static void main(String[] args) { List datas = null; Teacher teacher = null; try { XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); XmlPullParser parser = factory.newPullParser(); parser.setInput(new FileReader("teacher.xml")); int eventType = parser.getEventType(); while (eventType != XmlPullParser.END_DOCUMENT) { String tagName = parser.getName(); switch (eventType) { case XmlPullParser.START_DOCUMENT: // 创建list datas = new ArrayList<>(); break; case XmlPullParser.START_TAG: // 创建Teacher对象 if ("teacher".equals(tagName)) { teacher = new Teacher(); } else if ("name".equals(tagName)) { teacher.setName(parser.nextText()); } else if ("age".equals(tagName)) { teacher.setAge(Integer.parseInt(parser.nextText())); } else if ("money".equals(tagName)) { teacher.setMoney(Double.parseDouble(parser.nextText())); } break; case XmlPullParser.END_TAG: // 把对象添加进List集合中 if ("teacher".equals(tagName)) { datas.add(teacher); } break; default: break; } // 将eventType指向下一步... eventType = parser.next(); } } catch (XmlPullParserException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } for (int i = 0; i < datas.size(); i++) { System.out.println(datas.get(i)); } System.out.println(count); } }
這裡主要看while循環內部是如何讀取xml檔的..
首先循環的條件是eventType != XmlPullParser.END_DOCUMENT
如果eventType不等於XmlPullParser.END_DOCUMENT,就進行下一次迴圈。這裡eventType的值有11種,但用到的只有前5種。
public static final int START_DOCUMENT = 0; public static final int END_DOCUMENT = 1; public static final int START_TAG = 2; public static final int END_TAG = 3; public static final int TEXT = 4;
為了觀察循環執行的過程,我在迴圈內加入了一行程式碼:
System.out.println(eventType+"===第"+count+"次循环==="+tagName);
其中count是循環運行的次數。新增這行程式碼後控制台顯示出以下資訊:
0===第1次循环===null 2===第2次循环===teachers 4===第3次循环===null 2===第4次循环===teacher 4===第5次循环===null 2===第6次循环===name 4===第7次循环===null 2===第8次循环===age 4===第9次循环===null 2===第10次循环===money 4===第11次循环===null 3===第12次循环===teacher 4===第13次循环===null 2===第14次循环===teacher 4===第15次循环===null 2===第16次循环===name 4===第17次循环===null 2===第18次循环===age 4===第19次循环===null 2===第20次循环===money 4===第21次循环===null 3===第22次循环===teacher 4===第23次循环===null 3===第24次循环===teachers Teacher [name=zhangsan, age=19, money=12000.0] Teacher [name=lisi, age=23, money=8000.0] 24
先說一下,只有在下一次eventType值為4(也即下一次迴圈時讀取了TEXT)的情況下,讀取的內容parser.nextText()不為空
結合xml檔案來看,可以下結論:
第一次循環,eventType值為0,也即START_DOCUMENT的情況。此時tagName值為空。
第二次循環,eventType值為2,也即START_TAG的情況。此時tagName值為teachers。也就是說此時讀取到了這個標籤。由於下一次eventType值為4,也也就是TEXT的情況,所以這次讀取的內容parser.nextText()值為標籤到標籤中間的文字內容!也就是一個/n加一個/t。
第三次循環,eventType值為4,也即TEXT的情況。此時tagName值為空。
第四次循環,eventType值為2,也即START_TAG的情況。此時tagName值為teacher。也就是說此時讀取到了這個標籤。注意:此時if語句判斷出"teacher".equals(tagName)回傳值為true,會執行下面的teacher = new Teacher();來建立一個Teacher類別的物件。由於下一次eventType值為4,也也就是TEXT的情況,所以這次讀取的內容parser.nextText()值為標籤到標籤中間的文字內容,也就是一個/n加兩個/t。
第五次循環,eventType值為4,也即TEXT的情況。此時tagName值為空。
第六次循環,eventType值為2,也即START_TAG的情況。此時tagName值為name。也就是說此時讀取到了這個標籤。注意:此時if語句判斷出"name".equals(tagName)回傳值為true,會執行下面的teacher.setName(parser.nextText());,這裡的parser.nextText()值應該是zhangsan。這樣就把zhangsan賦值給了這個teacher物件的name屬性。
第七次循環,eventType值為4,也即TEXT的情況。此時tagName值為空。
後面好像不用講什麼了,都是一個意思。
ps: 每次遇到一個Teacher標籤(Teacher標籤是一個子標籤,Teachers是父標籤)都會建立一個物件,接著把裡面的孫標籤(name、age和money)賦值到這個物件的屬性。
ps2: 這個例子中孫標籤中的endtag不會被讀取。 (就是這種..)
xbox: eventType值為3的情況只有三種,這三種情況下tagName值分別為teacher、teacher和teachers。進一步說明了ps2是對的.....
以上是使用PULL解析XML檔案時循環過程的範例程式碼分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!