除了可以使用 SAX和DOM解析XML文件,大家也可以使用Android内置的Pull解析器解析XML文件。 Pull解析器的运行方式与 SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型元素的值。
Pull解析器的源码及文档下载网址:http://www.xmlpull.org/
       有些时候,我们需要生成一个XML文件,生成XML文件的方法有很多,如:可以只使用一个StringBuilder组拼XML内容,然后把内容写入到文件中;或者使用DOM API生成XML文件,或者也可以使用pull解析器生成XML文件,这里推荐大家使用Pull解析器。

       我们在android的工程下写代码测试,使用android的单元测试技术进行测试,当然测试类还要继承AndroidTestCase

layout/res/AndroidManifest.xml文件下添加单元测试所需要的代码:

AndroidManifest.xml文件的application节点下添加以下代码

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

 

AndroidManifest.xml文件的manifest节点下添加以下代码

<instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="你的测试文件所在的包名" android:label="Tests for My App" />

同样我们使用一个bean类来作为数据的接收,

Person.java

 1 package com.gaolei.domain;
 2 
 3 public class Person {
 4 
 5     private Integer id;
 6     private String name;
 7     private Integer age;
 8 
 9     public Integer getId() {
10         return id;
11     }
12 
13     public void setId(Integer id) {
14         this.id = id;
15     }
16 
17     public String getName() {
18         return name;
19     }
20 
21     public void setName(String name) {
22         this.name = name;
23     }
24 
25     public Integer getAge() {
26         return age;
27     }
28 
29     public void setAge(Integer age) {
30         this.age = age;
31     }
32 
33     @Override
34     public String toString() {
35         return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
36     }
37 
38     public Person(Integer id, String name, Integer age) {
39         this.id = id;
40         this.name = name;
41         this.age = age;
42     }
43 
44     public Person() {
45     }
46 
47 }
48 


person.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <persons>
 3     <person id="23">
 4         <name>gaolei</name>
 5         <age>30</age>
 6     </person>
 7     <person id="20">
 8         <name>xiaoqiang</name>
 9         <age>25</age>
10     </person>
11 </persons>
12 

PullPersonService pull解析器操作类

 1 package com.gaolei.service;
 2 
 3 import java.io.InputStream;
 4 import java.io.OutputStream;
 5 import java.util.ArrayList;
 6 import java.util.List;
 7 
 8 import org.xmlpull.v1.XmlPullParser;
 9 import org.xmlpull.v1.XmlSerializer;
10 
11 import android.util.Xml;
12 
13 import com.gaolei.domain.Person;
14 
15 public class PersonService {
16 
17     /**
18      * 获取数据
19      * 
20      * @param xml
21      * @return
22      * @throws Exception
23      */
24     public static List<Person> getPersons(InputStream xml) throws Exception {
25         List<Person> persons = null;
26         Person person = null;
27         XmlPullParser pullParser = Xml.newPullParser();
28         pullParser.setInput(xml, "UTF-8"); // 为Pull解析器设置要解析的XML数据
29         int event = pullParser.getEventType();
30         while (event != XmlPullParser.END_DOCUMENT) {
31             switch (event) {
32             case XmlPullParser.START_DOCUMENT:  // 文档开始事件,可以进行数据初始化处理
33                 persons = new ArrayList<Person>();
34                 break;
35             case XmlPullParser.START_TAG:
36                 if ("person".equals(pullParser.getName())) {
37                     int id = Integer.parseInt(pullParser.getAttributeValue(0));
38                     person = new Person();
39                     person.setId(id);
40                 }
41                 if ("name".equals(pullParser.getName())) {
42                     String name = pullParser.nextText();  // 如果后面是Text元素,即返回它的值
43                     person.setName(name);
44                 }
45                 if ("age".equals(pullParser.getName())) {
46                     int age = new Integer(pullParser.nextText());
47                     person.setAge(age);
48                 }
49                 break;
50             case XmlPullParser.END_TAG:  // 结束元素事件
51                 if ("person".equals(pullParser.getName())) {
52                     persons.add(person);
53                     person = null;
54                 }
55             }
56             event = pullParser.next();
57         }
58         return persons;
59     }
60 
61     /**
62      * 保存数据
63      * 
64      * @param persons
65      *            数据
66      * @param os
67      *            方向
68      * @throws Exception
69      */
70     public static void save(List<Person> persons, OutputStream os)
71             throws Exception {
72         XmlSerializer serializer = Xml.newSerializer();
73         serializer.setOutput(os, "UTF-8");
74         serializer.startDocument("UTF-8"true);
75         //第一个参数为命名空间,如果不使用命名空间,可以设置为null
76         serializer.startTag(null"persons");
77         for (Person person : persons) {
78             serializer.startTag(null"person");
79             serializer.attribute(null"id", person.getId().toString());
80 
81             serializer.startTag(null"name");
82             serializer.text(person.getName());
83             serializer.endTag(null"name");
84 
85             serializer.startTag(null"age");
86             serializer.text(person.getAge().toString());
87             serializer.endTag(null"age");
88 
89             serializer.endTag(null"person");
90         }
91         serializer.endTag(null"persons");
92         serializer.endDocument();
93         os.flush();
94         os.close();
95 
96     }
97 }
98 
PullPersonServiceTest pull解析器测试类

 1 package com.gaolei.test;
 2 
 3 import java.io.File;
 4 import java.io.FileOutputStream;
 5 import java.io.InputStream;
 6 import java.util.ArrayList;
 7 import java.util.List;
 8 
 9 import android.test.AndroidTestCase;
10 import android.util.Log;
11 
12 import com.gaolei.domain.Person;
13 import com.gaolei.service.PersonService;
14 
15 public class PersonServicTest extends AndroidTestCase {
16     public static final String TAG = "PersonServicTest";
17 
18     /**
19      * 使用pull解析器解析xml文件
20      * @throws Exception
21      */
22     public void testCase() throws Exception {
23 
24         InputStream xml = this.getClass().getClassLoader()
25                 .getResourceAsStream("person.xml");
26 
27         List<Person> persons = PersonService.getPersons(xml);
28         for (Person person : persons) {
29             Log.i(TAG, person.toString());
30         }
31     }
32 
33     /**
34      * 使用pull解析器生成xml文件
35      * @throws Exception
36      */
37     public void testSaveCase() throws Exception {
38 
39         List<Person> persons = new ArrayList<Person>();
40         persons.add(new Person(1"zhangsan"21));
41         persons.add(new Person(2"lisi"22));
42         persons.add(new Person(3"wangwu"23));
43 
44         // <包>/files
45         File xmlFile = new File(getContext().getFilesDir(), "gaolei.xml");
46         FileOutputStream fileOutputStream = new FileOutputStream(xmlFile);
47         PersonService.save(persons, fileOutputStream);
48     }
49 }