Android:Pull解析XML

    在上一篇文章写了SAX解析XML,感觉Pull方式和SAX方式非常相似,只是SAX需要一个辅助的类,解析时触发事件后在回调方法里面写代码,而Pull则通过调用事件类型的方法来返回一个int值,然后根据这个值来写代码。

首先自定义一个XML文件:Student.xml,注意是新建file而不是xml。

<?xml version="1.0" encoding="utf-8"?>  
<students>  
    <student id="1">  
        <name>张三</name>  
        <sex>男</sex>  
        <age>18</age>  
    </student>  
    <student id="2">  
        <name>李四</name>  
        <sex>女</sex>  
        <age>19</age>  
    </student>  
    <student id="3">  
        <name>王五</name>  
        <sex>男</sex>  
        <age>20</age>  
    </student>  
</students>

以解析第一项数据为例:

    <student id="1">  
        <name>张三</name>  
        <sex>男</sex>  
        <age>18</age>  
    </student>

 

 
整个流程是:int event = parser.getEventType()产生一个XmlPullParser.START_DOCUMENT:实例化List  →  event = parser.next()触发下一个事件,产生XmlPullParser.START_TAG,元素名为student,实例化student,将元素属性赋给相应字段  →    event = parser.next()触发下一个事件,产生XmlPullParser.START_TAG,元素名为name,将文本信息赋给相应字段  →  event = parser.next()触发下一个事件,产生XmlPullParser.END_TAG,没做什么反应  →  ......  →  最后是</student>XmlPullParser.END_TAG,元素名为student,将student这个对象存放在list中,将其置为null。 

最后在activity里面通过一个Button来解析数据,其中用到几个类。

package com.example.xml_sax_demo_1;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Xml;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends ActionBarActivity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		Button button = (Button) findViewById(R.id.button);
		button.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				try {
					readXML();
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		});
	}

	private void readXML() throws Exception {
		Student student = null;List<Student> list = null;
		XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance();
		XmlPullParser parser = xmlPullParserFactory.newPullParser();    //实例化XmlPullParser
		InputStream stream = this.getClass().getClassLoader()
				.getResourceAsStream("Student.xml"); // 获得输入流
		parser.setInput(stream, "UTF-8");                    //两个参数输入流,编码格式
		int event = parser.getEventType();// 产生第一个事件
		while (event != XmlPullParser.END_DOCUMENT) {
			switch (event) {
			case XmlPullParser.START_DOCUMENT:     
				list = new ArrayList<Student>();   //文档开始实例化list
				break;

			case XmlPullParser.START_TAG:                 
				if ("student".equals(parser.getName())) {
					student = new Student();
					student.setId(Integer.parseInt(parser.getAttributeValue(0)));
				}
				if (student != null) {
					if ("name".equals(parser.getName())) {
						student.setName(parser.nextText());
					} else if ("sex".equals(parser.getName())) {
						student.setSex(parser.nextText());
					} else if ("age".equals(parser.getName())) {
						student.setAge(Integer.parseInt(parser.nextText()));
					}
				}
				break;
			case XmlPullParser.END_TAG:
				if ("student".equals(parser.getName())) {
					list.add(student);
					student = null;
				}
				break;
			}
			event = parser.next();// 进入下一个元素并触发相应事件
		}
		for (Student stu : list) {
			System.out.println(stu.toString());
		}
	}
}

结果:


小结:XmlPullParser类几个比较重要的常量:START_DOCUMENT、END_DOCUMENT、START_TAG、END_TAG,其实还有一个Text。几个重要的方法getName(),获取元素名;nextText(),获取下一个文本信息;next(),读取下一个解析状态。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值