Android解析XML方式(二)使用PULL解析XML

在前一篇中介绍了使用SAX解析XML,本篇来讲一下如何使用JAVA自带的PULL来解析XML数据,以及它们的各自优点在哪里。

首先来看一下什么是PULL解析器以及它的基本特征:

PULL解析器的运行方式和SAX解析器很相似,它提供了类似的事件,如:开始元素和结束元素,使用parser,next() 可以进入下一个元素并且触发相应的事件,事件将作为代码被发送,因此可以使用一个switch来对事件进行选择,然后进行相应的处理。当开始解析元素的时候,调用parser.nextText()方法可以获得下一个Text类型的元素。

相对而言,使用PULL来解析比SAX要写的代码少很多,使用比较简单。

PULL的特点:

一、简单的结构:一个接口、一个例外、一个工厂组成的PULL解析器

二、简单易用:PULL解析器只有一个重要的方法next方法,他被用来检索下一个事件,而它只有5个常用的属性:

          1、STARTDOCUMENT

          2、START_TAG

          3、TEXT

          4、END_TAG

          5、END_DOCUMENT

 

这里同样通过一个例子来看一下如何使用它,我们建立一个工程Android_XML_PULL

工程目录结构:

Android解析XML方式(二)使用PULL解析XML_第1张图片

源代码如下:

person.xml

<?xml version="1.0" encoding="utf-8"?>
<persons>
    <person id="1">
        <name>liming</name>
        <age>23</age>
    </person>
    <person id="2">
        <name>zhangsan</name>
        <age>32</age>
    </person>
</persons>


Person.java

package com.pull.bean;

public class Person {
	private int id;
	private String name;
	private String age;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
	}
	
}


PersonService.java

package com.pull.service;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import android.util.Xml;
import com.pull.bean.Person;

public class PersonService {
	public static List<Person> getPersons(InputStream xml) throws IOException{
		List<Person> persons = null;
		Person person = null;
		XmlPullParser pullParser = Xml.newPullParser();
		try {
			pullParser.setInput(xml,"UTF-8");//为PULL解析器设置要解析的XML数据
			int event = pullParser.getEventType();
			while(event!=XmlPullParser.END_DOCUMENT){
				switch (event) {
				case XmlPullParser.START_DOCUMENT:
					persons = new ArrayList<Person>();
					break;
				case XmlPullParser.START_TAG:
					
					if("person".equals(pullParser.getName())){
						int id = new Integer(pullParser.getAttributeValue(0));
						person = new Person();
						person.setId(id);
					}
					if("name".equals(pullParser.getName())){
						String name = pullParser.nextText();
						person.setName(name);						
					}
					if("age".equals(pullParser.getName())){
						String age = pullParser.nextText();
						person.setAge(age);
					}
					break;
				case XmlPullParser.END_TAG:
					if("person".equals(pullParser.getName())){
						persons.add(person);
						person = null;
					}
					break;
				}
				event = pullParser.next();
			}
			
		} catch (XmlPullParserException e) {
			e.printStackTrace();
		}
		return persons;
	}
}


PersonServiceTest.java

package com.pull.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import com.pull.bean.Person;
import com.pull.service.PersonService;
import android.test.AndroidTestCase;
import android.util.Log;

public class PersonServiceTest extends AndroidTestCase{
	private static final String TAG = "PersonServiceTest";
	public void testPersons() throws IOException{
		InputStream xml = this.getClass().getClassLoader().getResourceAsStream("person.xml");
		List<Person> persons = PersonService.getPersons(xml);
		for(Person person:persons){
			Log.i(TAG, person.toString());
		}
	}
}

AndroidManifest.xml中添加AndroidJunit测试代码:

<uses-library android:name="android.test.runner"/>

<instrumentation android:name="android.test.InstrumentationTestRunner" 
   android:targetPackage="com.pull.activity" android:label="Tests for My App "/>


我们通过运行testPersons()这个测试方法,输出到LogCat的日志记录如下:

Android解析XML方式(二)使用PULL解析XML_第2张图片


你可能感兴趣的:(Android解析XML方式(二)使用PULL解析XML)