Android开发入门之采用Pull解析器解析和生成XML内容

Pull简介

常见的XML解析方式有三种,DOM,SAX,Pull,Android系统中推荐使用Pull

Pull解析器是一个开源的Java项目,Android系统内部解析XML文件均为此种方式,也可用于J2EE项目

Android SDK中已经集成了Pull解析器,无需添加任何jar文件

Pull解析器运行方式与SAX类似,提供各种事件的判断

官方网站:http://xmlpull.org/


使用XmlPullParser解析XML文件


Xml.newPullParser()获得解析器

parser.setInput(in, "UTF-8")设置输入流以及编码

parser.next()获取下一个解析事件,得到一个事件代码

XmlPullParser中定义了常量来标识各种解析事件

   START DOCUMENT             START_TAG           TEXT          END_TAG           END_DOCUMENT


使用XmlSerializer写出XML

使用以下方法生成XML,和XML文档顺序类似

startDocument

startTag

attribute

text

endTag

endDocument


第一步:新建一个Android工程命名为xml目录结构如下图:

Android开发入门之采用Pull解析器解析和生成XML内容_第1张图片

person.xml文件放在src目录下:

<?xml version="1.0" encoding="UTF-8"?>
<persons>
    <person id="23">
        <name>gaolei</name>
        <age>23</age>
    </person>
    <person id="24">
        <name>xiaoqiang</name>
        <age>25</age>
    </person>
</persons>

第二步:编写Person实体类如下:

package cn.leigo.domain;

public class Person {
	private Integer id;
	private String name;
	private Integer age;

	public Person() {
	}

	public Person(Integer id, String name, Integer age) {
		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 + "]";
	}

}

第三步:编写PersonService类来解析和生成Xml:

package cn.leigo.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 cn.leigo.domain.Person;

public class PersonService {

	/**
	 * 获取数据
	 * 
	 * @param in
	 * @return
	 * @throws XmlPullParserException
	 * @throws IOException
	 */
	public static List<Person> parser(InputStream in)
			throws XmlPullParserException, IOException {
		List<Person> persons = null;
		Person person = null;
		XmlPullParser parser = Xml.newPullParser();
		parser.setInput(in, "UTF-8");
		int eventType = parser.getEventType();
		while (eventType != XmlPullParser.END_DOCUMENT) {
			switch (eventType) {
			case XmlPullParser.START_DOCUMENT:
				persons = new ArrayList<Person>();
				break;
			case XmlPullParser.START_TAG:
				if ("person".equals(parser.getName())) {
					person = new Person();
					String id = parser.getAttributeValue(0);
					person.setId(Integer.valueOf(id));
				} else if ("name".equals(parser.getName())) {
					String name = parser.nextText();
					person.setName(name);
				} else if ("age".equals(parser.getName())) {
					String age = parser.nextText();
					person.setAge(Integer.parseInt(age));
				}
				break;
			case XmlPullParser.END_TAG:
				if ("person".equals(parser.getName())) {
					persons.add(person);
					person = null;
				}
				break;
			}
			eventType = parser.next();
		}
		return persons;
	}

	/**
	 * 保存数据
	 * 
	 * @param persons
	 *            数据
	 * @param os
	 *            输出方向
	 * @throws IllegalArgumentException
	 * @throws IllegalStateException
	 * @throws IOException
	 */
	public static void serializer(List<Person> persons, OutputStream os)
			throws IllegalArgumentException, IllegalStateException, IOException {
		XmlSerializer serializer = Xml.newSerializer();
		serializer.setOutput(os, "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() + "");

			serializer.startTag(null, "name");
			serializer.text(person.getName());
			serializer.endTag(null, "name");

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

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

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


最后在添加一个测试类:

package cn.leigo.test;

import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.test.AndroidTestCase;
import android.util.Log;
import cn.leigo.domain.Person;
import cn.leigo.service.PersonService;

public class PersonServiceTest extends AndroidTestCase {
	private static final String TAG = "PersonServiceTest";

	public void testPersons() throws Exception {
		InputStream in = this.getClass().getClassLoader()
				.getResourceAsStream("person.xml");
		List<Person> persons = PersonService.parser(in);
		for (Person person : persons) {
			Log.i(TAG, person.toString());
		}
	}

	public void testSave() throws Exception {
		List<Person> persons = new ArrayList<Person>();
		persons.add(new Person(1, "zhangsan", 24));
		persons.add(new Person(2, "lisi", 35));
		persons.add(new Person(3, "wangwu", 43));
		FileOutputStream fos = getContext().openFileOutput("persons.xml",
				Context.MODE_PRIVATE);
		PersonService.serializer(persons, fos);
	}
}

运行工程查看效果图:


解析Xml


生成Xml

生成的xml文件如下:

<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<persons>
    <person id="1">
        <name>zhangsan</name>
        <age>24</age>
    </person>
    <person id="2">
        <name>lisi</name>
        <age>35</age>    
    </person>
    <person id="3">
        <name>wangwu</name>
        <age>43</age>        
    </person>              
</persons>


你可能感兴趣的:(android)