除了可以使用SAX和DOM解析xml文件外,还可以使用Android系统内置的Pull解析器来解析xml文件。Pull解析器的运行方式与SAX解析器相似。它提供了类似的事件,如开始元素的结束元素事件。使用parser.next()可以进入下一个元素并触发相应事件,当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型元素的值。
Pull解析器有五种事件状态: START_DOCUMENT —> 类似于SAX解析中的startDocument()
START_TAG —> 类似于SAX解析中的startElement() TEXT —> 类似于SAX中的characters()
END_TAG —> 类似于SAX中的endElement() END_DOCUMENT —>
类似于SAX中的endDocument()
在Android解析xml(1)—SAX解析基础上修改StudyParser
import java.io.InputStream;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
import android.util.Log;
import com.example.data.Study;
public class StudyParser {
public static Study parse(InputStream is) {
Study study = null;
try {
XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
parser.setInput(is, "UTF-8");
int eventType = parser.getEventType();
while(eventType != XmlPullParser.END_DOCUMENT){
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
study = new Study();
break;
case XmlPullParser.START_TAG:
String tagName = parser.getName();
//如果标签名是<study>得到属性id值
if(tagName.equalsIgnoreCase(Study.STUDY)){
study.mId = Integer.parseInt(parser.getAttributeValue(null, Study.ID));
}
//如果标签名是<topic>
else if(tagName.equalsIgnoreCase(Study.TOPIC)){
study.mTopic = parser.nextText();
}
//如果标签名是<content>
else if(tagName.equalsIgnoreCase(Study.CONTENT)){
study.mContent = parser.nextText();
}
//如果标签名是<author>
else if(tagName.equalsIgnoreCase(Study.AUTHOR)){
study.mAuthor = parser.nextText();
}
//如果标签名是<date>
else if(tagName.equalsIgnoreCase(Study.DATE)){
study.mDate = parser.nextText();
}
break;
default:
break;
}
eventType = parser.next();
}
} catch(Exception ex) {
Log.d("XML", "StudyParser: parse() failed");
study = null;
}
return study;
}
}