首页 > Android > 正文

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

2014-08-27 Android 2551 ℃ 0 评论

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

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

1.png

 

按以下步骤进行操作:

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

<?xml version="1.0" encoding="utf-8"?>      <students>  
        <student id="20110806100">  
            <name>小明</name>  
            <age>22</age>  
            <sex>男</sex>  
        </student>  
        <student id="20110806101">  
            <name>小李</name>  
            <age>24</age>  
            <sex>男</sex>  
        </student>  
        <student id="20110806102">  
            <name>小丽</name>  
            <age>21</age>  
            <sex>女</sex>  
        </student>  
    </students>


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

 

 

 package com.andyidea.entity;        
    public class Student {  
          
        private String id;  
        private String name;  
        private int age;  
        private String sex;  
          
        public String getId() {  
            return id;  
        }  
        public void setId(String id) {  
            this.id = id;  
        }  
        public String getName() {  
            return name;  
        }  
        public void setName(String name) {  
            this.name = name;  
        }  
        public int getAge() {  
            return age;  
        }  
        public void setAge(int age) {  
            this.age = age;  
        }  
        public String getSex() {  
            return sex;  
        }  
        public void setSex(String sex) {  
            this.sex = sex;  
        }  
      
    }


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

 package com.andyidea.util;        
    import java.io.InputStream;  
    import java.util.ArrayList;  
    import java.util.List;  
      
    import org.xmlpull.v1.XmlPullParser;  
    import org.xmlpull.v1.XmlPullParserFactory;  
      
    import android.util.Xml;  
      
    import com.andyidea.entity.Student;  
      
    public class ParserByPULL {  
          
        //采用XmlPullParser来解析XML文件    
        public static List<Student> getStudents(InputStream inStream) throws Throwable   
        {    
            List<Student> students = null;    
            Student mStudent = null;    
              
            //========创建XmlPullParser,有两种方式=======  
            //方式一:使用工厂类XmlPullParserFactory  
            XmlPullParserFactory pullFactory = XmlPullParserFactory.newInstance();  
            XmlPullParser parser = pullFactory.newPullParser();  
            //方式二:使用Android提供的实用工具类android.util.Xml  
            //XmlPullParser parser = Xml.newPullParser();    
              
            //解析文件输入    
            parser.setInput(inStream, "UTF-8");    
            //产生第一个事件    
            int eventType = parser.getEventType();    
            //只要不是文档结束事件,就一直循环    
            while(eventType!=XmlPullParser.END_DOCUMENT)    
            {    
                switch (eventType)     
                {    
                    //触发开始文档事件    
                    case XmlPullParser.START_DOCUMENT:    
                        students = new ArrayList<Student>();    
                        break;    
                    //触发开始元素事件    
                    case XmlPullParser.START_TAG:    
                        //获取解析器当前指向的元素的名称    
                        String name = parser.getName();    
                        if("student".equals(name))    
                        {    
                            //通过解析器获取id的元素值,并设置student的id    
                            mStudent = new Student();    
                            mStudent.setId(parser.getAttributeValue(0));    
                        }    
                        if(mStudent!=null)    
                        {    
                            if("name".equals(name))    
                            {    
                                //获取解析器当前指向元素的下一个文本节点的值    
                                mStudent.setName(parser.nextText());    
                            }    
                            if("age".equals(name))    
                            {    
                                //获取解析器当前指向元素的下一个文本节点的值    
                                mStudent.setAge(new Short(parser.nextText()));    
                            }  
                            if("sex".equals(name))  
                            {  
                                //获取解析器当前指向元素的下一个文本节点的值    
                                mStudent.setSex(parser.nextText());  
                            }  
                        }    
                        break;    
                    //触发结束元素事件    
                    case XmlPullParser.END_TAG:    
                        //    
                        if("student".equals(parser.getName()))    
                        {    
                            students.add(mStudent);    
                            mStudent = null;    
                        }    
                        break;    
                    default:    
                        break;    
                }    
                eventType = parser.next();    
            }    
            return students;    
        }    
      
    }


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

 package com.andyidea.xmlparser;        
    import java.io.InputStream;  
    import java.util.List;  
      
    import com.andyidea.entity.Student;  
    import com.andyidea.util.ParserByPULL;  
      
    import android.app.Activity;  
    import android.content.res.AssetManager;  
    import android.os.Bundle;  
    import android.util.Log;  
      
    public class MainActivity extends Activity {  
        /** Called when the activity is first created. */  
        @Override  
        public void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.main);  
              
            AssetManager asset = getAssets();  
            try {  
                InputStream input = asset.open("student.xml");  
                List<Student> list = ParserByPULL.getStudents(input);  
                for (Student stu : list) {  
                       Log.e("StudentInfo","Person ID: " + stu.getId() + ","  
                             + stu.getName() + ", " + stu.getAge() + ", "  
                             + stu.getSex());  
                }  
            } catch (Throwable e) {  
                e.printStackTrace();  
            }  
        }  
    }


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

2.png


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

 


猜你喜欢

日历
«    2024年3月    »
123
45678910
11121314151617
18192021222324
25262728293031
标签列表
最近发表
友情链接