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

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

jsc11年前 (2014-08-27)Android3241

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

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

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

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

android上传图片至服务器

本实例实现了android上传手机图片至服务器,服务器进行保存服务器servlet代码publicvoid doPost(HttpServletRequest request, HttpServletResponse response)  ...

Android应用加入微信分享

Android应用加入微信分享

一、申请你的AppIDhttp://open.weixin.qq.com/  友情提示:推荐使用eclipse打包软件最后一步的MD5值去申请AppID二、官网下载libammsdk.jar包http://open.weixin.qq.com/download/?lang=zh_...

JAVA中使用JSON进行数据传递

最近在做一个基于JAVA Servlet的WEB应用以及对应的Anroid应用客户端的开发工作。其中,在接口的访问和数据的传输方面使用的比较多的是使用JSON对象来操作格式化数据:在服务器端采用JSON字符串来传递数据并在WEB前端或者Android客户端使用JSON来解析接收到的数据。首先,在JA...

Android经过Intent传输包含自定义类的ArrayList

Android通过Intent传输包含自定义类的ArrayList前言之前项目中通过Intent只是传输简单的字符串,这次因为需要在前一个页面联网获取对象数据,然后在下一个页面使用,所以考虑到使用Intent传输包含自定义类的ArrayList。SerializableJava的对象序列化指的是将那...

Activity之间数据交流(onActivityResult的用法)

Activity之间数据交流(onActivityResult的用法)

主要功能: 在一个主界面(主Activity)上能连接往许多不同子功能模块(子Activity上去),当子模块的事情做完之后就回到主界面,或许还同时返回一些子模块完成的数据交给主Activity处理。这样的数据交流就要用到回调函数onActivityResult。...