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

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

jsc11年前 (2014-08-27)Android3337

 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--SQLite(增,删,改,查)操作

            需要5个类:1.实体类:Person.java 2.抽象类:SQLOperate.java(封装了对数据库的操作) 3.助手类:DBOpenHelper.j...

google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果

google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果

    了解二维码这个东西还是从微信中,当时微信推出二维码扫描功能,自己感觉挺新颖的,从一张图片中扫一下竟然能直接加好友,不可思议啊,那时候还不了解二维码,呵呵,然后做项目的时候,老板说要加上二维码扫描功能,然后自己的屁颠屁颠的去百度,google...

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

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

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

Fragment保持状态切换

Fragment保持状态切换

在使用Activity管理多个Fragment时,每次切换Fragment使用的是replace,结果导致出现xxx is not currently in the FragmentManager异常挂掉网上说使用replace切换会使被切换的Fragment给替换掉,从而被被切换的Fra...

GridView中item高度自适应

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

Android开发之资源文件存储

在android开发中,资源文件是我们使用频率最高的,无论是string,drawable,还是layout,这些资源都是我们经常使用到的,而且为我们的开始提供很多方便,不过我们平时接触的资源目录一般都是下面这三个。        /res...