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文件时轮回历程的示例代码分享的细致内容,更多请关注ki4网别的相干文章!