解析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());
- }
- }
- break;
- case XmlPullParser.END_TAG://标签结束
- if ("chapter".equals(parser.getName())) {//结束标签</chapter>
- chapters.add(chapter);
- chapter = null;
- }
- break;
- default:
- break;
- }
- 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,如需转载请自行联系原作者