首页 > 代码库 > Android开发之XML解析PULL

Android开发之XML解析PULL

Android中解析xml是非常常用的操作,除了SAX和DOM两种最常用的解析xml外,Android内置的Pull解析器解析XML文件。 在Android的源码中大量的使用Pull解析,pull不仅更加的面相对象,而且使用速度和效率更高

Pull解析器是一个开源的java项目,既可以用于android,也可以用于JavaEE。如果用在javaEE需要把其jar文件放入类路径中,因为Android已经集成进了Pull解析器,所以无需添加任何jar文件。android系统本身使用到的各种xml文件,其内部也是采用Pull解析器进行解析的。 Pull解析器的运行方式与 SAX解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。跟SAX不同的是,Pull解析器产生的事件是一个数字,而非方法,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值。

下面代码演示如何使用Pull解析器:

如有一个person.xml

<?xml version="1.0" encoding="UTF-8"?>
<persons>
	<person id="23">
		<name>liming</name>
		<age>30</age>
	</person>
	<person id="20">
		<name>zhangxiaoxiao</name>
		<age>25</age>
	</person>
</persons>

Person实体:

package com.andy.domain;

public class Person {

	private Integer id;
	private String name;
	private Integer age;

	public Person() {

	}

	public Person(Integer id, String name, Integer age) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
	}

}

完成读写person.xml的PersonService类

package com.andy.service;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;

import android.util.Xml;

import com.andy.domain.Person;

public class PersonService {

	public static List<Person> getPersons(InputStream xml)
			throws XmlPullParserException, IOException {

		List<Person> persons = null;
		Person person = null;

		// XmlPullParser pullParser =
		// XmlPullParserFactory.newInstance().newPullParser();
		XmlPullParser pullParser = Xml.newPullParser();

		pullParser.setInput(xml, "UTF-8"); // 为xml设置要解析的xml数据

		int eventType = pullParser.getEventType();

		while (eventType != XmlPullParser.END_DOCUMENT) {
			switch (eventType) {
			case XmlPullParser.START_DOCUMENT:

				persons = new ArrayList<Person>();
				break;

			case XmlPullParser.START_TAG:
				if ("person".equals(pullParser.getName())) {
					int id = Integer.valueOf(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())) {
					int age = Integer.valueOf(pullParser.nextText());
					person.setAge(age);
				}
				break;

			case XmlPullParser.END_TAG:
				if ("person".equals(pullParser.getName())) {
					persons.add(person);
					person = null;
				}
				break;

			}

			eventType = pullParser.next();

		}

		return persons;
	}

	public static void savePerson(List<Person> persons,
			OutputStream outputStream) throws IllegalArgumentException,
			IllegalStateException, IOException {

		XmlSerializer serializer = Xml.newSerializer();
		serializer.setOutput(outputStream, "UTF-8");

		serializer.startDocument("UTF-8", true);
		serializer.startTag(null, "persons");
		for (Person person : persons) {
			serializer.startTag(null, "person");
			serializer.attribute(null, "id", person.getId().toString());
			serializer.startTag(null, "name");

			serializer.text(person.getName());

			serializer.endTag(null, "name");

			serializer.startTag(null, "age");
			serializer.text(person.getAge().toString());
			serializer.endTag(null, "age");

			serializer.endTag(null, "person");
		}

		serializer.endTag(null, "persons");
		serializer.endDocument();
		
		outputStream.flush();
		outputStream.close();

	}

}


Android开发之XML解析PULL