解析xml的三种方式:DOM, SAX, PULL

好像Android学习过程中SAX被提到的概率高了一些. 固然SAX解析很好,并且名字很sexy. 可Pull解析有过之而无不及.

开工.

先认识一个文件catalogue.xml,放置于assets文件夹下

   
   
   
   
  1. xml version="1.0" encoding="UTF-8"?> 
  2. <chapters> 
  3.         <chapter id="1"> 
  4.             <name>wait_notify_demoname> 
  5.             <summary>wait_notify例子summary> 
  6.         chapter> 
  7. chapters> 

可以理解为一本书的章节对象, 第一章名为wait_notify_demo

然后我们要解析之

   
   
   
   
  1. package com.lc.corecode.utility; 
  2.  
  3. import java.io.InputStream; 
  4. import java.util.LinkedList; 
  5. import java.util.List; 
  6. import org.xmlpull.v1.XmlPullParser; 
  7. import android.util.Xml; 
  8. import com.lc.corecode.pojo.Chapter; 
  9.  
  10. public class PullParse { 
  11.     /** 
  12.      * pull解析catalogue.xml 
  13.      * @param inputStream 目标文件 
  14.      * @return chapter对象的集合 
  15.      * @throws Exception 
  16.      */ 
  17.     public List getAllChapters(InputStream inputStream) throws Exception{ 
  18.         List chapters = null
  19.         Chapter chapter = null
  20.         XmlPullParser parser =Xml.newPullParser(); 
  21.         parser.setInput(inputStream, "UTF-8"); 
  22.          
  23.         int event = parser.getEventType();//产生第一个事件 
  24.         while (event != XmlPullParser.END_DOCUMENT) { 
  25.             switch (event) { 
  26.             case XmlPullParser.START_DOCUMENT://文档开始 
  27.                 chapters = new LinkedList(); 
  28.                 break
  29.             case XmlPullParser.START_TAG://标签开始事件 
  30.                 if ("chapter".equals(parser.getName())) {//标签为 
  31.                     chapter = new Chapter(); 
  32.                     chapter.setId(Integer.parseInt(parser.getAttributeValue(0))); 
  33.                 } 
  34.                 if (chapter != null) { 
  35.                     if ("name".equals(parser.getName())) {//标签为 
  36.                         chapter.setName(parser.nextText()); 
  37.                     } else if ("summary".equals(parser.getName())){ 
  38.                         chapter.setSummary(parser.nextText()); 
  39.                     } 
  40.                 } 
  41.                 break
  42.             case XmlPullParser.END_TAG://标签结束 
  43.                 if ("chapter".equals(parser.getName())) {//结束标签 
  44.                     chapters.add(chapter); 
  45.                     chapter = null
  46.                 } 
  47.                 break
  48.             default
  49.                 break
  50.             } 
  51.             event = parser.next();//进入下一个元素 
  52.         } 
  53.         return chapters; 
  54.     } 

最后是找个地方调用

   
   
   
   
  1. PullParse pullParse = new PullParse(); 
  2. List chapters = pullParse.getAllChapters(getResources().getAssets().open("catalogue.xml")); 

收工.