解析xml的三種方式:DOM, SAX, PULL
好像Android學習過程中SAX被提到的機率高了一些. 固然SAX解析很好,并且名字很sexy. 可Pull解析有過之而無不及.
開工.
先認識一個檔案catalogue.xml,放置于assets檔案夾下
<?xml version="1.0" encoding="UTF-8"?>
<chapters>
<chapter id="1">
<name>wait_notify_demo</name>
<summary>wait_notify例子</summary>
</chapter>
</chapters>
可以了解為一本書的章節對象, 第一章名為wait_notify_demo
然後我們要解析之
package com.lc.corecode.utility;
import java.io.InputStream;
import java.util.LinkedList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import android.util.Xml;
import com.lc.corecode.pojo.Chapter;
public class PullParse {
/**
* pull解析catalogue.xml
* @param inputStream 目标檔案
* @return chapter對象的集合
* @throws Exception
*/
public List<Chapter> getAllChapters(InputStream inputStream) throws Exception{
List<Chapter> chapters = null;
Chapter chapter = null;
XmlPullParser parser =Xml.newPullParser();
parser.setInput(inputStream, "UTF-8");
int event = parser.getEventType();//産生第一個事件
while (event != XmlPullParser.END_DOCUMENT) {
switch (event) {
case XmlPullParser.START_DOCUMENT://文檔開始
chapters = new LinkedList<Chapter>();
break;
case XmlPullParser.START_TAG://标簽開始事件
if ("chapter".equals(parser.getName())) {//标簽為<chapter>
chapter = new Chapter();
chapter.setId(Integer.parseInt(parser.getAttributeValue(0)));
}
if (chapter != null) {
if ("name".equals(parser.getName())) {//标簽為<name>
chapter.setName(parser.nextText());
} else if ("summary".equals(parser.getName())){
chapter.setSummary(parser.nextText());
}
case XmlPullParser.END_TAG://标簽結束
if ("chapter".equals(parser.getName())) {//結束标簽</chapter>
chapters.add(chapter);
chapter = null;
default:
}
event = parser.next();//進入下一個元素
}
return chapters;
}
}
最後是找個地方調用
PullParse pullParse = new PullParse();
List<Chapter> chapters = pullParse.getAllChapters(getResources().getAssets().open("catalogue.xml"));
收工.
本文轉自chainli 51CTO部落格,原文連結:http://blog.51cto.com/lichen/1194036,如需轉載請自行聯系原作者