您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關使用PULL解析XML文件時循環過程的案例的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
XML文件內容如下(名字為"teacher.xml") <?xml version="1.0" encoding="UTF-8"?> zhangsan 1912000 lisi 23 8000使用PULL解析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文件時循環過程的案例”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。