[置顶] Android中的XML解析与生成——Pull解析xml、实现xml文件的生成

除了可以使用 SAX和DOM解析XML文件,大家也可以使用Android内置的Pull解析器解析XML文件。 Pull解析器的运行方式与 SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型元素的值。

 

Pull解析器的源码及文档下载网址:http://www.xmlpull.org/

 

步骤

添加文件 PullPersonService

public class PullPersonService {

	public static List<Person> getPersonList(InputStream inStream)
			throws Exception {
		List<Person> personList = null;

		XmlPullParser parser = Xml.newPullParser();
		parser.setInput(inStream, "utf-8");

		int eventType = parser.getEventType();

		Person person = null;

		while (eventType != XmlPullParser.END_DOCUMENT) {
			switch (eventType) {
			case XmlPullParser.START_DOCUMENT:
				personList = new ArrayList<Person>();
				break;
			case XmlPullParser.START_TAG:
				// 判断当前元素名是否为person
				if ("person".equals(parser.getName())) {
					person = new Person();
					person.setId(Integer.valueOf(parser.getAttributeValue(0)));
				} else if ("name".equals(parser.getName())) {
					person.setName(parser.nextText());
				} else if ("age".equals(parser.getName())) {
					person.setAge(Integer.valueOf(parser.nextText()));
				}
				break;
			case XmlPullParser.END_TAG:
				if ("person".equals(parser.getName()) && person != null) {
					personList.add(person);
					person = null;
				}
				break;
			}

			// next方法的调用导致下一个节点的解析,同时返回下一个节点解析的事件类型代码
			eventType = parser.next();
		}
		return personList;
	}

测试方法

public void testPull() throws Throwable {
		InputStream inStream = this.getClass().getClassLoader()
				.getResourceAsStream("person_list.xml");
		List<Person> personList = PullPersonService.getPersonList(inStream);
		Log.i("TAG", personList.toString());		
	}

Pull实现xml文件的生成

有些时候,我们需要生成一个XML文件,生成XML文件的方法有很多,如:可以只使用一个StringBuilder组拼XML内容,然后把内容写入到文件中;或者使用DOM API生成XML文件,或者也可以使用pull解析器生成XML文件,这里推荐大家使用Pull解析器。

 

使用Pull解析器生成一个与itcast.xml文件内容相同的myitcast.xml文件,代码在本页下方备注

 

使用代码如下(生成XML文件):

File xmlFile = new File("person.xml");
FileOutputStream outStream = new FileOutputStream(xmlFile);
OutputStreamWriter outStreamWriter = new OutputStreamWriter(outStream, "UTF-8");
BufferedWriter writer = new BufferedWriter(outStreamWriter);
writeXML(persons, writer);
writer.flush();
writer.close();


 

如果只想得到生成的xml字符串内容,可以使用StringWriter:

StringWriter writer = new StringWriter();

writeXML(persons, writer);

String content = writer.toString();

实例介绍:

1、在PullPersonService中添加静态方法

	public static void writePersonList(List<Person> personList, Writer writer)
			throws Exception {
		XmlSerializer serializer = Xml.newSerializer();
		serializer.setOutput(writer);

		// 相当于写入<?xml version="1.0" encoding="UTF-8"?>
		serializer.startDocument("utf-8", true);
		//写入跟元素的起始标签
		serializer.startTag(null, "persons");
		
		//遍历personList,并且将集合中的Person对象作为person节点写入xml
		for(Person person: personList){
			serializer.startTag(null, "person");
			//为person元素添加id属性
			serializer.attribute(null, "id", String.valueOf(person.getId()));
			
			serializer.startTag(null, "name");
			serializer.text(person.getName());
			serializer.endTag(null, "name");
			
			serializer.startTag(null, "age");
			serializer.text(String.valueOf(person.getAge()));
			serializer.endTag(null, "age");
			
			serializer.endTag(null, "person");
		}		
		
		//写入跟元素的结束标签		
		serializer.endTag(null, "persons");
		//结束文档的写入
		serializer.endDocument();
		
		writer.flush();
		writer.close();
	}

添加测试方法

 

public void testPullSave() throws Throwable{
		List<Person> personList = new ArrayList<Person>();
		personList.add(new Person(999,"Tom", 20));
		personList.add(new Person(888,"Mary", 21));
		personList.add(new Person(777,"Jack", 10));
		
		File file = new File(this.getContext().getFilesDir(), "new_persons.xml");
		Writer writer = new FileWriter(file);
		
		PullPersonService.writePersonList(personList, writer);
	}
}

 

3、执行android单元测试

在视图中打开FileExplorer,在如下路径中找到生成的文件

data -> data -> cn.class3g.activity-> file – new_person.xml

文件浏览器界面图:

 

 

 

 


 

你可能感兴趣的:([置顶] Android中的XML解析与生成——Pull解析xml、实现xml文件的生成)