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

原创 2011年08月07日 23:24:06

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

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

按以下步骤进行操作:

[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]最后我们运行程序看看结果如下:


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

Android之PULL解析XML

今天我们一起通过一个小例子来学习一下使用PULL解析器解析XML文件。 (1)首先我们放一个文件名为beauties.xml的XML文件到assets目录下,文件内容如下: ...
  • bear_huangzhen
  • bear_huangzhen
  • 2014年04月29日 10:22
  • 25626

Android pull解析

XML解析有三种,我在这里就说一下Android中的pull解析: 使用pull解析,我们就得获取XmlPullParser的对象。有两种方法:          方法1:          通过Xm...
  • liujianshui
  • liujianshui
  • 2014年02月21日 18:09
  • 502

【Android】pull解析xml文件+将数据存储为xml格式,并保存在内存里

在解析中,常用到的还有一种解析就是pull去解析xml格式的文件。事实上android内部也是这样做的。今天这个demo是来自传智播客,可能技术已经被翻新了。 但是基础原理还是那样,希望基础学习者,能...
  • f627422467
  • f627422467
  • 2015年08月19日 15:11
  • 1453

浅析PULL解析

浅析PULL解析1. 基本介绍PULL方式解析XML是在Android中极力推荐使用的一种解析XML的方式,但PULL解析除了在Android中可以使用外,在JavaSE中仍然可以使用。在JavaSE...
  • zhliro
  • zhliro
  • 2015年07月10日 13:54
  • 2488

android pull 解析xml方式

pull解析xml文件,和sax和dom一样 都可以脱离android单独使用,pull和sax的原理一样,不一样的地方是pull读取xml文件后调用方法返回的是数字,     读取到xml的声明返...
  • nxh_love
  • nxh_love
  • 2011年12月28日 17:39
  • 7659

Xml的PULL解析方式

public class MainActivity extends Activity { private Person person; List list = new ArrayList(...
  • IT_Android_long
  • IT_Android_long
  • 2016年06月13日 08:35
  • 140

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

Pull解析器的运行方式与 SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。跟SAX不同的是, Pull解析器产生的...
  • cjjky
  • cjjky
  • 2011年08月07日 23:24
  • 11366

Android PULL解析XML

  • 2017年07月27日 13:36
  • 21.28MB
  • 下载

Android pull方式解析XML文件

个人认为DOM, SAX, PULL3种解析XML的方式中Pull是最适合在android系统中使用的,轻便,灵活,占用资源较少 废话不说,先把xml源文件描述如下: ...
  • qiuxiaolong007
  • qiuxiaolong007
  • 2012年08月03日 17:24
  • 694

android 使用pull方式解析xml文件

如题,应该网络上讲解的是比较多了,我这里只是做一个简单的总结。 首先在工程的src目录下建一个person.xml文件: 好,我们现在就用pull方式来解析这个xml文件,文件内容如下:注...
  • yehui18sui
  • yehui18sui
  • 2013年05月08日 22:17
  • 736
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android中使用PULL方式解析XML文件
举报原因:
原因补充:

(最多只允许输入30个字)