官网:
http://www.xmlpull.org
本文参考 :
http://www.xmlpull.org/v1/download/unpacked/doc/quick_intro.html
1. xml文件结构
xm是一个文档(Document),文档里有多个元素(Element),元素由标签(tag)+子元素或内容组成,标签分头标签和尾标签.
文档(Document)
元素1头标签
子元素或内容
元素1尾标签.
...
元素n头标签
子元素n或内容n
元素n尾标签.
2. 解析xml过程
每到一个标签产生一个事件 ,XmlPullParser有下面几个重要事件:
START DOCUMENT 开始解析事件
START_TAG 一个元素标签的开始事件,这时解析该元素的属性值
TEXT 解析该元素的内容事件,这时解析该元素的内容值
END_TAG 一个元素标签的结束事件
END_DOCUMENT 解析结束事件
举例:
<!-- 产生 START DOCUMENT --> <?xml version="1.0" encoding="utf-8"?> <lauguages cat="it"> <!-- 产生 START_TAG --> <lan id="1"> <name> <!-- 产生 START_TAG --> Java <!-- 产生 TEXT --> </name> <!-- 产生 END_TAG --> <ide>Eclipse</ide> </lan> ... </lauguages> <!-- 产生 END_TAG --> <!-- 产生 END_DOCUMENT -->
3.重要的函数
next,nextTag,getText,nextText,getAttribute...
详细介绍 http://www.cnblogs.com/cocl/p/4655489.html
4.官方示例与本例中被解析的xml文件
5.自写示例
5.1 初始化
XmlPullParser parser = Xml.newPullParser(); parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); parser.setInput(in, null);//in是InputStream,指向xml文件流
5.2 遍历
void foreach(InputStream in)throws Exception{ parser = Xml.newPullParser(); parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); parser.setInput(in, null); //现在parser处于 XmlPullParser.START_DOCUMENT if (parser.getEventType() == XmlPullParser.START_DOCUMENT) { System.out.println("====Start Document===="); } String name = ""; while ( parser.next() != XmlPullParser.END_DOCUMENT) { switch (parser.getEventType()) { case XmlPullParser.START_TAG: name = parser.getName(); System.out.println("Start Tag " + name); for (int i = 0; i < parser.getAttributeCount(); i++) { System.out.print("< " + name + "> 的属性名:" + parser.getAttributeName(i)); System.out.println(" 属性值为: "+parser.getAttributeValue(i)); } break; case XmlPullParser.TEXT: System.out.println("< " + name + "> 的值:" + parser.getText()); break; case XmlPullParser.END_TAG: System.out.println("End Tag " + name); break; default: break; } } //现在parser处于 XmlPullParser.END_DOCUMENT if (parser.getEventType() == XmlPullParser.END_DOCUMENT) { System.out.println("====End Document===="); } int ev = -1; parser.next();//到 END_DOCUMENT后就一直是END_DOCUMENT ev = parser.next(); ev = parser.getEventType(); }
5.3 解析
/* * * <entry> <id>http://stackoverflow.com/q/9439999</id> <re:rank scheme="http://stackoverflow.com">0</re:rank> <title type="text">Where is my data file?</title> <category scheme="http://stackoverflow.com/feeds/tag?tagnames=android&sort=newest/tags" term="android"/> <category scheme="http://stackoverflow.com/feeds/tag?tagnames=android&sort=newest/tags" term="file"/> <author> <name>cliff2310</name> <uri>http://stackoverflow.com/users/1128925</uri> </author> <link rel="alternate" href="http://stackoverflow.com/questions/9439999/where-is-my-data-file" /> <published>2012-02-25T00:30:54Z</published> <updated>2012-02-25T00:30:54Z</updated> <summary type="html"> <p>I have an Application that requires a data file...</p> </summary> </entry> * */ public Entry parseEntry() throws XmlPullParserException, IOException { Entry entry = new Entry(); parser.require(XmlPullParser.START_TAG, ns, "entry");//如果不是entry则出异常 System.out.println("-----------start entry ---------"); //1.解析entry的属性,本例子中没有 . //2.解析entry的子元素 while (parser.next() != XmlPullParser.END_TAG) { if (parser.getEventType() != XmlPullParser.START_TAG) {//从每个element都是从START_TAG事件开始. continue; } String name = parser.getName(); if (name.equals("id")) { /* <id>http://stackoverflow.com/q/9439999</id> */ parser.next(); entry.id = parser.getText(); parser.next(); //上面3句 可以用一句, /*entry.id = parser.nextText();*/ System.out.println("parser id"); } else if (name.equals("re:rank")) { /* <re:rank scheme="http://stackoverflow.com">0</re:rank> */ entry.re_rank_scheme = parser.getAttributeValue(null, "scheme"); entry.re_rank = parser.nextText(); System.out.println("parser re:rank"); } else if (name.equals("title")) { /* <title type="text">Where is my data file?</title> */ parseTitle(entry); System.out.println("parser title"); } else if (name.equals("category")) { parseCategory(entry); System.out.println("parser category"); } else if (name.equals("author")) { parseAuthor(entry); System.out.println("parser author"); } else if (name.equals("link")) { parseLink(entry); System.out.println("parser link"); } else if (name.equals("published")) { entry.published = parser.nextText(); System.out.println("parser published"); } else if (name.equals("updated")) { entry.updated = parser.nextText(); System.out.println("parser updated"); } else if (name.equals("summary")) { parseSummary(entry); System.out.println("parser summary"); } }; parser.require(XmlPullParser.END_TAG, ns, "entry"); System.out.println("-----------end entry ---------"); return entry; }
5.4 只对兴趣元素解析
/* *<feed xmlns="http://www.w3.org/2005/Atom" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule"> <title type="tt">newest questions tagged android - Stack Overflow</title> <class type="ct"> <id>15079</id> <name>zhang</name> </class> <school type="st" /> <entry> ...本例只对entry感兴趣 </entry> ... </feed> */ public List<Entry> parseFeed()throws XmlPullParserException, IOException{ parser.require(XmlPullParser.START_TAG, ns, "feed"); System.out.println("____________start feed____________"); //1.解析feed的属性,本例子中没有 . //2.解析feed的子元素 while (parser.next() != XmlPullParser.END_TAG) { if (parser.getEventType() != XmlPullParser.START_TAG) { continue; } String name = parser.getName(); if (name.equals("entry")) {// Starts by looking for the entry tag entries.add(parseEntry()); }else{ skip();//跳过entry同级的其它元素 } } parser.require(XmlPullParser.END_TAG, ns, "feed"); System.out.println("____________end feed____________"); return entries; }
skip函数
// Skips tags the parser isn't interested in. Uses depth to handle nested tags. i.e., // if the next tag after a START_TAG isn't a matching END_TAG, it keeps going until it // finds the matching END_TAG (as indicated by the value of "depth" being 0). private void skip() throws XmlPullParserException, IOException { if (parser.getEventType() != XmlPullParser.START_TAG) { throw new IllegalStateException(); } int depth = 1; while (depth != 0) { switch (parser.next()) { case XmlPullParser.END_TAG: depth--; break; case XmlPullParser.START_TAG: depth++; break; } } }