(1)
PULL解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使用,Android系统内部在解析各种XML时也是用PULL解析器,Android官方推荐开发者们使用Pull解析技术。Pull解析技术是第三方开发的开源技术,它同样可以应用于JavaSE开发。
PULL 的工作原理:XML pull提供了开始元素和结束元素。当某个元素开始时,我们可以调用parser.nextText从XML文档中提取所有字符数据。当解释到一个文档结束时,自动生成EndDocument事件。
常用的XML pull的接口和类:
XmlPullParser:XML pull解析器是一个在XMLPULL VlAP1中提供了定义解析功能的接口。
XmlSerializer:它是一个接口,定义了XML信息集的序列。
XmlPullParserFactory:这个类用于在XMPULL V1 API中创建XML Pull解析器。
XmlPullParserException:抛出单一的XML pull解析器相关的错误。
这是我自己建的一个xml文件person.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <persons>
- <person id="1">
- <name>小明</name>
- <age>25</age>
- </person>
- <person id="2">
- <name>哈哈</name>
- <age>76</age>
- </person>
- </persons>
大家注意一下我存放XML的位置
好了,现在的目的就是把person.xml里的内容解析出来,看一下xml内容利用我们的面向对象的知识,我们需要建立一个实体类来存放解析出来的信息
所以先来建立一个Person类。
- package com.wjg.xml.entity;
-
- public class Person {
- public Person() {
- super();
- }
- public Person(Integer id, String name, Integer age) {
- super();
- this.id = id;
- this.name = name;
- this.age = age;
- }
- private Integer id;
- private String name;
- private Integer 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 + "]";
- }
-
-
- }
好了,实体类建好之后需要开始解析xml的步骤,建一个Service(这里其实应该抽象出一个接口来,让自己写的service实现这个接口,懒得写了。呵呵)
- package com.wjg.xml.service;
-
- import java.io.InputStream;
- import java.util.ArrayList;
- import java.util.List;
-
- import org.xmlpull.v1.XmlPullParser;
- import org.xmlpull.v1.XmlPullParserFactory;
-
- import android.util.Xml;
-
- import com.wjg.xml.entity.Person;
-
- public class PollXmlService {
- public static final List<Person> readXml(InputStream xml) throws Exception{
-
-
-
-
- XmlPullParser xmlPullParser=Xml.newPullParser();
-
- xmlPullParser.setInput(xml, "UTF-8");
-
- int eventType=xmlPullParser.getEventType();
-
- List<Person> persons=null;
- Person person=null;
- while(eventType!=XmlPullParser.END_DOCUMENT){
- switch (eventType) {
- case XmlPullParser.START_DOCUMENT:
- persons=new ArrayList<Person>();
- break;
- case XmlPullParser.START_TAG:
- if(xmlPullParser.getName().equals("person")){
- person=new Person();
- person.setId(Integer.parseInt(xmlPullParser.getAttributeValue(0)));
- }else if(xmlPullParser.getName().equals("name")){
- person.setName(xmlPullParser.nextText());
- }else if(xmlPullParser.getName().equals("age")){
- person.setAge(Integer.parseInt(xmlPullParser.nextText()));
- }
- break;
- case XmlPullParser.END_TAG:
- if(xmlPullParser.getName().equals("person")){
- persons.add(person);
- person=null;
- }
- break;
- case XmlPullParser.END_DOCUMENT:
- xml.close();
- }
- eventType=xmlPullParser.next();
- }
- return persons;
- }
- }
方法写完了,咱们来测试一下。在项目清单文件中添加测试库。
建立测试类
- package com.wjg.xml.test;
-
- import java.io.InputStream;
- import java.util.List;
- import android.test.AndroidTestCase;
- import android.util.Log;
- import com.wjg.xml.entity.Person;
- import com.wjg.xml.service.PollXmlService;
-
- public class TestXml extends AndroidTestCase{
- private final static String TAG="TestXml";
- public void testReadXml() throws Exception{
-
-
-
-
- InputStream is=this.getContext().getClassLoader().getResourceAsStream("person.xml");
-
- List<Person> persons=PollXmlService.readXml(is);
- for (Person person : persons) {
-
- Log.i(TAG, person.toString());
- }
- }
- }
现在右击测试方法,选择Android JunitTest,切换到DDMS控制台。查看LogCat输入的日志
成功了,PULL解析XML文件就是这么简单(LogCat控制台我使用了过滤器,过滤我定义的Tag,所以只显示我想看到的信息)。
上面我们涉及到了利用Pull解析器对xml进行解析,转换为LIst对象。
(2)
这篇呢,来看一下PULL解析器如何将LIst<Person>序列化到XML文件中去在上篇的PollXmlService中加入一个方法
我们需要一个LIst对象和一个输出流
-
-
-
-
-
-
- public final static void exportXml(List<Person> persons,OutputStream ops)throws Exception{
-
- XmlSerializer xs=Xml.newSerializer();
-
- xs.setOutput(ops, "UTF-8");
-
- xs.startDocument("UTF-8", true);
- xs.startTag(null,"persons");
- for (Person person : persons) {
- xs.startTag(null,"person");
- xs.attribute(null, "id", person.getId().toString());
-
- xs.startTag(null, "name");
- xs.text(person.getName());
- xs.endTag(null, "name");
-
- xs.startTag(null, "age");
- xs.text(person.getAge().toString());
- xs.endTag(null, "age");
- xs.endTag(null, "person");
- }
- xs.endTag(null, "persons");
- xs.endDocument();
- ops.flush();
- ops.close();
- }
好了。现在开始测试,在上次的测试类中加入一个测试方法
- public void testExportXml() throws Exception{
- List<Person> persons=new ArrayList<Person>();
- persons.add(new Person(1,"你妹",25));
- persons.add(new Person(2,"呵呵",12));
- persons.add(new Person(3,"哈哈",43));
- persons.add(new Person(4,"嘿嘿",56));
- File file=new File(this.getContext().getFilesDir().getAbsoluteFile()+"/testpersons.xml");
- FileOutputStream fos=new FileOutputStream(file);
- PollXmlService.exportXml(persons, fos);
- }
执行Android Junit Test
来看一下我们自定义的文件testpersons.xml文件生成了
把xml导出到桌面上,打开看一下
- <?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
- <persons><person id="1"><name>你妹</name><age>25</age></person>
- <person id="2"><name>呵呵</name><age>12</age></person>
- <person id="3"><name>哈哈</name><age>43</age></person>
- <person id="4"><name>嘿嘿</name><age>56</age></person>
- </persons>