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

         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方式解析的结果。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值