Android中使用PULL方式解析XML文件

 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]最后我们运行程序看看结果如下:

以上黑色方框中的内容就是采用PULL方式解析的结果。

猜你喜欢

转载自lishuaishuai.iteye.com/blog/1818343
今日推荐