Pull解析器的运行方式与 SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。跟SAX不同的是, Pull解析器产生的事件是一个数字,而非方法,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值。

         下面我们通过Demo例子来介绍如何使用PULL机制来解析XML文件。先看下如下工程的目录结构:

按以下步骤进行操作:

[1] 新建一个XML文件,命名为student.xml。同时把XML文件放置到assets目录下。student.xml文件的内容如下:



[html]  view plain copy



1. <?xml version="1.0" encoding="utf-8"?>  
2. <students>  
3.     <student id="20110806100">  
4.         <name>小明</name>  
5.         <age>22</age>  
6.         <sex>男</sex>  
7.     </student>  
8.     <student id="20110806101">  
9.         <name>小李</name>  
10.         <age>24</age>  
11.         <sex>男</sex>  
12.     </student>  
13.     <student id="20110806102">  
14.         <name>小丽</name>  
15.         <age>21</age>  
16.         <sex>女</sex>  
17.     </student>  
18. </students>
  1.  



[2] 根据XML文件中的节点目录,创建一个相对应的实体类,来保存解析的相应信息。在包:com.andyidea.entity下新建Student.java类。



[html]  view plain copy


1. package com.andyidea.entity;  
2.   
3. public class Student {  
4.       
5.     private String id;  
6.     private String name;  
7.     private int age;  
8.     private String sex;  
9.       
10.     public String getId() {  
11.         return id;  
12.     }  
13.     public void setId(String id) {  
14.         this.id = id;  
15.     }  
16.     public String getName() {  
17.         return name;  
18.     }  
19.     public void setName(String name) {  
20.         this.name = name;  
21.     }  
22.     public int getAge() {  
23.         return age;  
24.     }  
25.     public void setAge(int age) {  
26.         this.age = age;  
27.     }  
28.     public String getSex() {  
29.         return sex;  
30.     }  
31.     public void setSex(String sex) {  
32.         this.sex = sex;  
33.     }  
34.   
35. }


[3] 定义一个使用PULL解析XML文件的工具类:ParserByPULL.java。



[html]  view plain copy



    1. package com.andyidea.util;  
    2.   
    3. import java.io.InputStream;  
    4. import java.util.ArrayList;  
    5. import java.util.List;  
    6.   
    7. import org.xmlpull.v1.XmlPullParser;  
    8. import org.xmlpull.v1.XmlPullParserFactory;  
    9.   
    10. import android.util.Xml;  
    11.   
    12. import com.andyidea.entity.Student;  
    13.   
    14. public class ParserByPULL {  
    15.       
    16.     //采用XmlPullParser来解析XML文件    
    17.     public static List<Student> getStudents(InputStream inStream) throws Throwable   
    18.     {    
    19.         List<Student> students = null;    
    20.         Student mStudent = null;    
    21.           
    22.         //========创建XmlPullParser,有两种方式=======  
    23.         //方式一:使用工厂类XmlPullParserFactory  
    24.         XmlPullParserFactory pullFactory = XmlPullParserFactory.newInstance();  
    25.         XmlPullParser parser = pullFactory.newPullParser();  
    26.         //方式二:使用Android提供的实用工具类android.util.Xml  
    27.         //XmlPullParser parser = Xml.newPullParser();    
    28.           
    29.         //解析文件输入流    
    30.         parser.setInput(inStream, "UTF-8");    
    31.         //产生第一个事件    
    32.         int eventType = parser.getEventType();    
    33.         //只要不是文档结束事件,就一直循环    
    34.         while(eventType!=XmlPullParser.END_DOCUMENT)    
    35.         {    
    36.             switch (eventType)     
    37.             {    
    38.                 //触发开始文档事件    
    39.                 case XmlPullParser.START_DOCUMENT:    
    40.                     students = new ArrayList<Student>();    
    41.                     break;    
    42.                 //触发开始元素事件    
    43.                 case XmlPullParser.START_TAG:    
    44.                     //获取解析器当前指向的元素的名称    
    45.                     String name = parser.getName();    
    46.                     if("student".equals(name))    
    47.                     {    
    48.                         //通过解析器获取id的元素值,并设置student的id    
    49.                         mStudent = new Student();    
    50.                         mStudent.setId(parser.getAttributeValue(0));    
    51.                     }    
    52.                     if(mStudent!=null)    
    53.                     {    
    54.                         if("name".equals(name))    
    55.                         {    
    56.                             //获取解析器当前指向元素的下一个文本节点的值    
    57.                             mStudent.setName(parser.nextText());    
    58.                         }    
    59.                         if("age".equals(name))    
    60.                         {    
    61.                             //获取解析器当前指向元素的下一个文本节点的值    
    62.                             mStudent.setAge(new Short(parser.nextText()));    
    63.                         }  
    64.                         if("sex".equals(name))  
    65.                         {  
    66.                             //获取解析器当前指向元素的下一个文本节点的值    
    67.                             mStudent.setSex(parser.nextText());  
    68.                         }  
    69.                     }    
    70.                     break;    
    71.                 //触发结束元素事件    
    72.                 case XmlPullParser.END_TAG:    
    73.                     //    
    74.                     if("student".equals(parser.getName()))    
    75.                     {    
    76.                         students.add(mStudent);    
    77.                         mStudent = null;    
    78.                     }    
    79.                     break;    
    80.                 default:    
    81.                     break;    
    82.             }    
    83.             eventType = parser.next();    
    84.         }    
    85.         return students;    
    86.     }    
    87.   
    88. }



    [4] 该Demo的入口类:MainActivity.java



    [html]  view plain copy



      1. package com.andyidea.xmlparser;  
      2.   
      3. import java.io.InputStream;  
      4. import java.util.List;  
      5.   
      6. import com.andyidea.entity.Student;  
      7. import com.andyidea.util.ParserByPULL;  
      8.   
      9. import android.app.Activity;  
      10. import android.content.res.AssetManager;  
      11. import android.os.Bundle;  
      12. import android.util.Log;  
      13.   
      14. public class MainActivity extends Activity {  
      15.     /** Called when the activity is first created. */  
      16.     @Override  
      17.     public void onCreate(Bundle savedInstanceState) {  
      18.         super.onCreate(savedInstanceState);  
      19.         setContentView(R.layout.main);  
      20.           
      21.         AssetManager asset = getAssets();  
      22.         try {  
      23.             InputStream input = asset.open("student.xml");  
      24.             List<Student> list = ParserByPULL.getStudents(input);  
      25.             for (Student stu : list) {  
      26.                    Log.e("StudentInfo","Person ID: " + stu.getId() + ","  
      27.                          + stu.getName() + ", " + stu.getAge() + ", "  
      28.                          + stu.getSex());  
      29.             }  
      30.         } catch (Throwable e) {  
      31.             e.printStackTrace();  
      32.         }  
      33.     }  
      34. }



      [5]最后我们运行程序看看结果如下:



       


       Pull解析器的运行方式与 SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。跟SAX不同的是, Pull解析器产生的事件是一个数字,而非方法,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值。

               下面我们通过Demo例子来介绍如何使用PULL机制来解析XML文件。先看下如下工程的目录结构:

      按以下步骤进行操作:

      [1] 新建一个XML文件,命名为student.xml。同时把XML文件放置到assets目录下。student.xml文件的内容如下:



      [html]  view plain copy



        1. <?xml version="1.0" encoding="utf-8"?>  
        2. <students>  
        3.     <student id="20110806100">  
        4.         <name>小明</name>  
        5.         <age>22</age>  
        6.         <sex>男</sex>  
        7.     </student>  
        8.     <student id="20110806101">  
        9.         <name>小李</name>  
        10.         <age>24</age>  
        11.         <sex>男</sex>  
        12.     </student>  
        13.     <student id="20110806102">  
        14.         <name>小丽</name>  
        15.         <age>21</age>  
        16.         <sex>女</sex>  
        17.     </student>  
        18. </students>



        [2] 根据XML文件中的节点目录,创建一个相对应的实体类,来保存解析的相应信息。在包:com.andyidea.entity下新建Student.java类。



        [html]  view plain copy



          1. package com.andyidea.entity;  
          2.   
          3. public class Student {  
          4.       
          5.     private String id;  
          6.     private String name;  
          7.     private int age;  
          8.     private String sex;  
          9.       
          10.     public String getId() {  
          11.         return id;  
          12.     }  
          13.     public void setId(String id) {  
          14.         this.id = id;  
          15.     }  
          16.     public String getName() {  
          17.         return name;  
          18.     }  
          19.     public void setName(String name) {  
          20.         this.name = name;  
          21.     }  
          22.     public int getAge() {  
          23.         return age;  
          24.     }  
          25.     public void setAge(int age) {  
          26.         this.age = age;  
          27.     }  
          28.     public String getSex() {  
          29.         return sex;  
          30.     }  
          31.     public void setSex(String sex) {  
          32.         this.sex = sex;  
          33.     }  
          34.   
          35. }


          [3] 定义一个使用PULL解析XML文件的工具类:ParserByPULL.java。



          [html]  view plain copy



            1. package com.andyidea.util;  
            2.   
            3. import java.io.InputStream;  
            4. import java.util.ArrayList;  
            5. import java.util.List;  
            6.   
            7. import org.xmlpull.v1.XmlPullParser;  
            8. import org.xmlpull.v1.XmlPullParserFactory;  
            9.   
            10. import android.util.Xml;  
            11.   
            12. import com.andyidea.entity.Student;  
            13.   
            14. public class ParserByPULL {  
            15.       
            16.     //采用XmlPullParser来解析XML文件    
            17.     public static List<Student> getStudents(InputStream inStream) throws Throwable   
            18.     {    
            19.         List<Student> students = null;    
            20.         Student mStudent = null;    
            21.           
            22.         //========创建XmlPullParser,有两种方式=======  
            23.         //方式一:使用工厂类XmlPullParserFactory  
            24.         XmlPullParserFactory pullFactory = XmlPullParserFactory.newInstance();  
            25.         XmlPullParser parser = pullFactory.newPullParser();  
            26.         //方式二:使用Android提供的实用工具类android.util.Xml  
            27.         //XmlPullParser parser = Xml.newPullParser();    
            28.           
            29.         //解析文件输入流    
            30.         parser.setInput(inStream, "UTF-8");    
            31.         //产生第一个事件    
            32.         int eventType = parser.getEventType();    
            33.         //只要不是文档结束事件,就一直循环    
            34.         while(eventType!=XmlPullParser.END_DOCUMENT)    
            35.         {    
            36.             switch (eventType)     
            37.             {    
            38.                 //触发开始文档事件    
            39.                 case XmlPullParser.START_DOCUMENT:    
            40.                     students = new ArrayList<Student>();    
            41.                     break;    
            42.                 //触发开始元素事件    
            43.                 case XmlPullParser.START_TAG:    
            44.                     //获取解析器当前指向的元素的名称    
            45.                     String name = parser.getName();    
            46.                     if("student".equals(name))    
            47.                     {    
            48.                         //通过解析器获取id的元素值,并设置student的id    
            49.                         mStudent = new Student();    
            50.                         mStudent.setId(parser.getAttributeValue(0));    
            51.                     }    
            52.                     if(mStudent!=null)    
            53.                     {    
            54.                         if("name".equals(name))    
            55.                         {    
            56.                             //获取解析器当前指向元素的下一个文本节点的值    
            57.                             mStudent.setName(parser.nextText());    
            58.                         }    
            59.                         if("age".equals(name))    
            60.                         {    
            61.                             //获取解析器当前指向元素的下一个文本节点的值    
            62.                             mStudent.setAge(new Short(parser.nextText()));    
            63.                         }  
            64.                         if("sex".equals(name))  
            65.                         {  
            66.                             //获取解析器当前指向元素的下一个文本节点的值    
            67.                             mStudent.setSex(parser.nextText());  
            68.                         }  
            69.                     }    
            70.                     break;    
            71.                 //触发结束元素事件    
            72.                 case XmlPullParser.END_TAG:    
            73.                     //    
            74.                     if("student".equals(parser.getName()))    
            75.                     {    
            76.                         students.add(mStudent);    
            77.                         mStudent = null;    
            78.                     }    
            79.                     break;    
            80.                 default:    
            81.                     break;    
            82.             }    
            83.             eventType = parser.next();    
            84.         }    
            85.         return students;    
            86.     }    
            87.   
            88. }



            [4] 该Demo的入口类:MainActivity.java



            [html]  view plain copy



              1. package com.andyidea.xmlparser;  
              2.   
              3. import java.io.InputStream;  
              4. import java.util.List;  
              5.   
              6. import com.andyidea.entity.Student;  
              7. import com.andyidea.util.ParserByPULL;  
              8.   
              9. import android.app.Activity;  
              10. import android.content.res.AssetManager;  
              11. import android.os.Bundle;  
              12. import android.util.Log;  
              13.   
              14. public class MainActivity extends Activity {  
              15.     /** Called when the activity is first created. */  
              16.     @Override  
              17.     public void onCreate(Bundle savedInstanceState) {  
              18.         super.onCreate(savedInstanceState);  
              19.         setContentView(R.layout.main);  
              20.           
              21.         AssetManager asset = getAssets();  
              22.         try {  
              23.             InputStream input = asset.open("student.xml");  
              24.             List<Student> list = ParserByPULL.getStudents(input);  
              25.             for (Student stu : list) {  
              26.                    Log.e("StudentInfo","Person ID: " + stu.getId() + ","  
              27.                          + stu.getName() + ", " + stu.getAge() + ", "  
              28.                          + stu.getSex());  
              29.             }  
              30.         } catch (Throwable e) {  
              31.             e.printStackTrace();  
              32.         }  
              33.     }  
              34. }



              [5]最后我们运行程序看看结果如下: