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

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

jsc11年前 (2014-08-27)Android3223

 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文件” 的相关文章

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

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

Android动态布局,并动态为TextView控件设置drawableLeft、drawableRight等属性添加图标

Android动态布局,并动态为TextView控件设置drawableLeft、drawableRight等属性添加图标

注:(图中每一个条目和图标都是由代码动态生成) 代码动态布局,并需要为每一个条目设置图标,此时用到了 android:drawableLeft="@drawable/icon" ...

Android中的消息通知(NotificationManager和Notification)

下面来谈谈notification,这个notification一般用在电话,短信,邮件,闹钟铃声,在手机的状态栏上就会出现一个小图标,提 示用户处理这个通知,这时手从上方滑动状态栏就可以展开并处理这个快讯。已添加的Notification.Builder,使其更容易构建通知。 notifica...

获取Android手机中SD卡存储信息

SD卡作为手机的扩展存储设备,在手机中充当硬盘角色,可以让我们手机存放更多的数据以及多媒体等大体积文件。因此查看SD卡的内存就跟我们查看硬盘的剩余空间一样,是我们经常操作的一件事,那么在Android开发中,我们如何能获取SD卡的内存容量呢?首先,要获取SD卡上面的信息,必须先对SD卡有访问的权限,...

安卓对话框之----多选框(CheckBox)

安卓对话框之----多选框(CheckBox)

简单讲解一下原理:每个多选框都是独立的,可以通过迭代所有多选框,然后根据其状态是否被选中再获取其值。 CheckBox.setChecked(true);//设置成选中状态。 CheckBox.getText();//获取多选框的值 调用setOnCheck...

Activity的四种launchMode

Activity的四种launchMode

launchMode在多个Activity跳转的过程中扮演着重要的角色,它可以决定是否生成新的Activity实例,是否重用已存在的 Activity实例,是否和其他Activity实例公用一个task里。这里简单介绍一下task的概念,task是一个具有栈结构的对象,一个 task可以管理多个...