当前位置:首页 > Android > 正文内容

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

jsc11年前 (2014-08-27)Android3406

 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方式解析的结果。

 


扫描二维码推送至手机访问。

版权声明:本文由微小站发布,如需转载请注明出处。

本文链接:https://jsc0.com/post/18.html

标签: PULL解析
分享给朋友:

“Android中使用PULL方式解析XML文件” 的相关文章

安卓开发中Android消息机制详解

在Android程序运行中,线程之间或者线程内部进行信息交互时经常会使用到消息,如果我们熟悉这些基础的东西及其内部的原理,将会使我们的Android开发变的容易、可以更好地架构系统。在学习Android消息机制之前,我们先了解与消息有关的几个类:  1.Message  消息对象,顾名思义就是记录消...

android异步任务详解 AsynTask

android异步任务详解 AsynTask

android提供了一套专门用于异步处理的类。即:AynsTask类。使用这个类可以为耗时程序开辟一个新线程进行处理,处理完时返回。其实,AsynTask类就是对Thread类的一个封装,并且加入了一些新的方法。编程时,两者都可以实现同样的功能。本文后面将对AsynTask和Thread...

实现应用程序只有在第一次启动时显示引导界面

第一次安装启动:启动页--->导航页-->主页面之后启动:启动页-->主页面实现的原理就是:在启动页面用做一个文件保存的状态,保存程序是不是第一次启动的状态。因为只是要保存一个状态,我们将这个程序是第一次打开就将他设为true,当他进入 主页面之后将他的状态未为false,因为都...

下拉刷新及滚动到底部加载更多的Listview使用

下拉刷新及滚动到底部加载更多的Listview使用

本文主要介绍可同时实现下拉刷新及滑动到底部加载更多的ListView的使用。 该ListView优点包括:a. 可自定义下拉响应事件(如下拉刷新)  b.可自定义滚动到底部响应的事件(如滑动到底部加载更多)  c.可自定义丰富的样式  d....

Android 学习之 开源项目PullToRefresh的使用

Android 学习之 开源项目PullToRefresh的使用

首先 下载 Android-PullToRefresh-master 下载地址  https://github.com/chrisbanes/Android-PullToRefresh 下载之...

GridView中item高度自适应

item高度自适应public class MyAdapter extends BaseAdapter {         GridView mGv;&n...