首頁  >  文章  >  後端開發  >  使用PULL解析XML檔案時循環過程的範例程式碼分享

使用PULL解析XML檔案時循環過程的範例程式碼分享

黄舟
黄舟原創
2017-03-18 16:40:531730瀏覽

XML檔案內容如下(名字為"teacher.xml") 52b189f45abba88b2989c5c1f30b7a34 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn