Android中使用Pull解析器解析xml文件+进行简单的单元测试

Android中使用Pull解析器解析xml文件+进行简单的单元测试


我来给大家介绍Android用得最多的一种解析xml数据的技术:Pull解析器解析,之前介绍过Java中两种解析xml的技术:Dom解析和SAX解析,Dom比较适合小数据量的解析,然而SAX适合大数据量的解析工作,但比较复杂。第三种解析技术Pull解析,是一种比前面两种方法更加简单的解析技术,更加符合面向对象的思想,因为这是按照我们正常的思考方式进行解析,下面来看看利用这种解析器的实现过程。

首先我们需要知道这个xml文件的内容:
[html]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <persons>  
  3.     <person id="23">  
  4.         <name>liming</name>  
  5.         <age>30</age>  
  6.     </person>  
  7.     <person id="20">  
  8.         <name>zhangxiaoxiao</name>  
  9.         <age>25</age>  
  10.     </person>  
  11. </persons>  

这是最典型的xml格式的数据,它有以下几个组成部分
1. START_DOCUMENT--- 文档的开始部分
[html]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
2. START_TAG  ---开始标签
[html]  view plain copy
  1. <persons>  
3. END_TAG  ---结束标签
[html]  view plain copy
  1. </persons>  
4. END_DOCUMENT  ---文档结束部分


知道文档的组织结构之后,就可以往这个方向去思考怎么解析数据了
定义以下方法
[java]  view plain copy
  1. /** 
  2.      * 获取数据 
  3.      * @param xml 
  4.      * @return 
  5.      * @throws Exception 
  6.      */  
  7.     public static List<Person> getPersons(InputStream xml) throws Exception {  
  8.         List<Person> persons = null;  
  9.         Person person = null;  
  10.         XmlPullParser pullParser = Xml.newPullParser(); // 获取Pull解析器  
  11.         pullParser.setInput(xml, "UTF-8");//为Pull解析器设置要解析的XML数据  
  12.         int event = pullParser.getEventType();  //获取第一次解析所产生的事件  
  13.         while (event != pullParser.END_DOCUMENT) {  
  14.   
  15.             switch (event) {  
  16.             case XmlPullParser.START_DOCUMENT:  
  17.                 persons = new ArrayList<Person>();  
  18.                 break;  
  19.             case XmlPullParser.START_TAG:  
  20.                 if("person".equals(pullParser.getName())){  
  21.                     int id = new Integer(pullParser.getAttributeValue(0));  
  22.                     person = new Person();  
  23.                     person.setId(id);  
  24.                 }  
  25.                 if("name".equals(pullParser.getName())){  
  26.                     String name = pullParser.nextText();  
  27.                     person.setName(name);  
  28.                 }  
  29.                 if("age".equals(pullParser.getName())) {  
  30.                     int age = new Integer(pullParser.nextText());  
  31.                     person.setAge(age);  
  32.                 }  
  33.                 break;  
  34.                   
  35.             case XmlPullParser.END_TAG:  
  36.                 if("person".equals(pullParser.getName())){  
  37.                     persons.add(person);  
  38.                     person = null;  
  39.                 }  
  40.                 break;  
  41.             }  
  42.             event = pullParser.next();  
  43.   
  44.         }  
  45.         return persons;  
  46.     }  


解析出来的结果保存到一个集合里,我们通过集合就可把数据取出来了。

因为已经知道xml文档结构,我们当然也可以将数据保存问xml格式的数据
这里需要用到Android为我们提供的xml序列化器,首先需要获得这个序列号器,然后分别设置各个标签的内容,具体实现如下:
[java]  view plain copy
  1. /** 
  2.      * 保存数据 
  3.      * @param persons 
  4.      * @param out 
  5.      * @throws Exception 
  6.      */  
  7.     public static void save(List<Person> persons, OutputStream out) throws Exception {  
  8.         XmlSerializer serializer = Xml.newSerializer(); //得到Xml序列化器  
  9.         serializer.setOutput(out, "UTF-8");  
  10.         serializer.startDocument("UTF-8"true);  
  11.         serializer.startTag(null"persons");  
  12.         for(Person person : persons) {  
  13.             serializer.startTag(null"person");  
  14.             serializer.attribute(null"id", person.getId().toString());  
  15.               
  16.             serializer.startTag(null"name");  
  17.             serializer.text(person.getName());  
  18.             serializer.endTag(null"name");  
  19.               
  20.             serializer.startTag(null"age");  
  21.             serializer.text(person.getAge().toString());  
  22.             serializer.endTag(null"age");  
  23.               
  24.             serializer.endTag(null"person");  
  25.         }  
  26.         serializer.endTag(null"persons");  
  27.         serializer.endDocument();  
  28.         out.flush();  
  29.         out.close();  
  30.     }  
  31.       

这个方法需要传入一个集合,和一个输出流;方法调用结束后,就会把文件输出到指定目录下。


介绍完Pull解析和输出xml文件的方法之后,小巫最近学到了如何在Android下进行简单的单元测试,是一个很重要的技能。
要进行单元测试需要进行以下几个步骤:
1.  在AndroidMenifest.xml文件中进行配置,完整的配置文件如下:
[html]  view plain copy
  1. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     package="org.wwj.xml"  
  3.     android:versionCode="1"  
  4.     android:versionName="1.0" >  
  5.   
  6.     <uses-sdk  
  7.         android:minSdkVersion="8"  
  8.         android:targetSdkVersion="15" />  
  9.   
  10.     <application  
  11.         android:icon="@drawable/ic_launcher"  
  12.         android:label="@string/app_name"  
  13.         android:theme="@style/AppTheme" >  
  14.         <activity  
  15.             android:name=".MainActivity"  
  16.             android:label="@string/title_activity_main" >  
  17.             <intent-filter>  
  18.                 <action android:name="android.intent.action.MAIN" />  
  19.   
  20.                 <category android:name="android.intent.category.LAUNCHER" />  
  21.             </intent-filter>  
  22.         </activity>  
  23.         <uses-library android:name="android.test.runner" />  
  24.     </application>  
  25. <instrumentation android:name="android.test.InstrumentationTestRunner"  
  26.   android:targetPackage="org.wwj.xml" android:label="Tests for My App" />  
  27. </manifest>  

上面的文件,如入了uses-library,和测试环境instrumentation。
这是必须要做的步骤,不然无法进行单元测试。

2.  定义类继承AndroidTestCase

定义一个PersonServiceTest类,继承AndroidTestCase,用于对上面的方法进行测试。
[java]  view plain copy
  1. package org.wwj.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 org.wwj.domain.Person;  
  10. import org.wwj.service.PersonService;  
  11.   
  12. import android.test.AndroidTestCase;  
  13. import android.util.Log;  
  14.   
  15. /** 
  16.  * 单元测试类 
  17.  * @author wwj 
  18.  * 继承AndroidTestCase 
  19.  */  
  20. public class PersonServiceTest extends AndroidTestCase{  
  21.     private final static String TAG = "PersonServiceTest";      //定义打印标签  
  22.       
  23.     /** 
  24.      * 测试xml文件解析 
  25.      * 在logcat中查看结果 
  26.      * @throws Exception 
  27.      */  
  28.     public void testPersons() throws Exception {  
  29.         //获得输入流  
  30.         InputStream xml = this.getClass().getClassLoader().getResourceAsStream("person.xml");  
  31.         List<Person> persons = PersonService.getPersons(xml); //解析文件,返回一个集合  
  32.         for(Person person : persons) {  //增强型for循环,打印输出信息  
  33.             Log.i(TAG, person.toString());  
  34.         }  
  35.     }  
  36.       
  37.       
  38.     /** 
  39.      * 测试输出文件 
  40.      * @throws Exception 
  41.      */  
  42.     public void testSave() throws Exception {  
  43.         List<Person> persons = new ArrayList<Person>();  
  44.         persons.add(new Person(1"xiaoming"20));  
  45.         persons.add(new Person(2"lishi"21));  
  46.         persons.add(new Person(3"wangwu"22));  
  47.           
  48.         //定义一个文件,保存在当前上下文下的files目录下,输出文件为wwj.xml  
  49.         File xmlFile = new File(getContext().getFilesDir(), "wwj.xml");  
  50.         FileOutputStream out = new FileOutputStream(xmlFile);  
  51.         PersonService.save(persons, out);  
  52.           
  53.     }  
  54. }  

3. 找到测试的方法,右键Run--Run Android JUnit  Test
如果有如下的测试效果,说明测试通过


     

猜你喜欢

转载自blog.csdn.net/a8082649/article/details/39741353