除了可以使用 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  }