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.          //方式三:使用Resources的getXml()方法返回XmlResourceParser对象 
  29.          //XmlResourceParser Parser=getResources().getXml(R.xml.student);
  30.          
  31.        //用着三种中的任一种,只需把标签开头的类变一下即可。以第三个为例只需把XmlPullParser.END_DOCUMENT改为XmlResourceParser.END_DOCUMENT所        //有标签都这么改即可

  1.         //解析文件输入流    
  2.         parser.setInput(inStream, "UTF-8");    
  3.         //产生第一个事件    
  4.         int eventType = parser.getEventType();    
  5.         //只要不是文档结束事件,就一直循环    
  6.         while(eventType!=XmlPullParser.END_DOCUMENT)    
  7.         {    
  8.             switch (eventType)     
  9.             {    
  10.                 //触发开始文档事件    
  11.                 case XmlPullParser.START_DOCUMENT:    
  12.                     students = new ArrayList<Student>();    
  13.                     break;    
  14.                 //触发开始元素事件    
  15.                 case XmlPullParser.START_TAG:    
  16.                     //获取解析器当前指向的元素的名称    
  17.                     String name = parser.getName();    
  18.                     if("student".equals(name))    
  19.                     {    
  20.                         //通过解析器获取id的元素值,并设置student的id    
  21.                         mStudent = new Student();    
  22.                         mStudent.setId(parser.getAttributeValue(0));    
  23.                     }    
  24.                     if(mStudent!=null)    
  25.                     {    
  26.                         if("name".equals(name))    
  27.                         {    
  28.                             //获取解析器当前指向元素的下一个文本节点的值    
  29.                             mStudent.setName(parser.nextText());    
  30.                         }    
  31.                         if("age".equals(name))    
  32.                         {    
  33.                             //获取解析器当前指向元素的下一个文本节点的值    
  34.                             mStudent.setAge(new Short(parser.nextText()));    
  35.                         }  
  36.                         if("sex".equals(name))  
  37.                         {  
  38.                             //获取解析器当前指向元素的下一个文本节点的值    
  39.                             mStudent.setSex(parser.nextText());  
  40.                         }  
  41.                     }    
  42.                     break;    
  43.                 //触发结束元素事件    
  44.                 case XmlPullParser.END_TAG:    
  45.                     //    
  46.                     if("student".equals(parser.getName()))    
  47.                     {    
  48.                         students.add(mStudent);    
  49.                         mStudent = null;    
  50.                     }    
  51.                     break;    
  52.                 default:    
  53.                     break;    
  54.             }    
  55.             eventType = parser.next();    
  56.         }    
  57.         return students;    
  58.     }    
  59.   
  60. }  

[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方式解析的结果。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值