`

XML解析和生成之--pull(android内置)

阅读更多

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

下面我们来写代码学习pull解析技术。

要解析的xml文件名为:target.xml,解析的内容如下:

Xml代码 复制代码 收藏代码
  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>lixiangmei</name>  
  9.         <age>25</age>  
  10.     </person>  
  11. </persons>   

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

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

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

 

Xml代码 复制代码 收藏代码
  1. <uses-library android:name="android.test.runner" />   

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

Xml代码 复制代码 收藏代码
  1. <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="你的测试文件所在的包名" android:label="Tests for My App" />  

 

Java代码 复制代码 收藏代码
  1. public class Person {   
  2.     private Integer id;   
  3.     private String name;   
  4.     private Short age;   
  5.     public Person(){}//无参构造器   
  6.        
  7.     public Person(Integer id, String name, Short age) {   
  8.         this.id = id;   
  9.         this.name = name;   
  10.         this.age = age;   
  11.     }   
  12.        
  13.     public Integer getId() {   
  14.         return id;   
  15.     }   
  16.     public void setId(Integer id) {   
  17.         this.id = id;   
  18.     }   
  19.     public String getName() {   
  20.         return name;   
  21.     }   
  22.     public void setName(String name) {   
  23.         this.name = name;   
  24.     }   
  25.     public Short getAge() {   
  26.         return age;   
  27.     }   
  28.     public void setAge(Short age) {   
  29.         this.age = age;   
  30.     }   
  31.     @Override  
  32.     public String toString() {   
  33.         return "Person [age=" + age + ", id=" + id + ", name=" + name + "]";   
  34.     }   
  35. }   

pull解析的核心类:PULLPersonService.java,里面包含两个方法,一个是生成xml文件的方法,一个事解析xml文件的方法。

Java代码 复制代码 收藏代码
  1. /**  
  2.  * 采用Pull解析XML内容  
  3.  */  
  4. public class PULLPersonService {   
  5.        
  6.     /**  
  7.      * 使用pull技术生成xml文件  
  8.      * @param persons  
  9.      * @param writer  
  10.      * @throws Throwable  
  11.      */  
  12.     public static void save(List<Person> persons, Writer writer) throws Throwable{   
  13.         XmlSerializer serializer = Xml.newSerializer();   
  14.         serializer.setOutput(writer);   
  15.         serializer.startDocument("UTF-8"true);   
  16.            
  17.         serializer.startTag(null"persons");   
  18.         for(Person person : persons){   
  19.             serializer.startTag(null"person");   
  20.             serializer.attribute(null"id", person.getId().toString());   
  21.                
  22.             serializer.startTag(null"name");   
  23.             serializer.text(person.getName());   
  24.             serializer.endTag(null"name");   
  25.                
  26.             serializer.startTag(null"age");   
  27.             serializer.text(person.getAge().toString());   
  28.             serializer.endTag(null"age");   
  29.                
  30.             serializer.endTag(null"person");   
  31.         }   
  32.         serializer.endTag(null"persons");        
  33.         serializer.endDocument();   
  34.         writer.flush();   
  35.         writer.close();   
  36.     }   
  37.   
  38.     /**  
  39.      * 使用pull技术解析xml  
  40.      * @param inStream  
  41.      * @return  
  42.      * @throws Throwable  
  43.      */  
  44.     public static List<Person> getPersons(InputStream inStream) throws Throwable{   
  45.         List<Person> persons = null;   
  46.         Person person = null;   
  47.         XmlPullParser parser = Xml.newPullParser();   
  48.         parser.setInput(inStream, "UTF-8");   
  49.         int eventType = parser.getEventType();//产生第一个事件   
  50.         while(eventType!=XmlPullParser.END_DOCUMENT){//只要不是文档结束事件   
  51.             switch (eventType) {   
  52.             case XmlPullParser.START_DOCUMENT:   
  53.                 persons = new ArrayList<Person>();   
  54.                 break;   
  55.        
  56.             case XmlPullParser.START_TAG:   
  57.                 String name = parser.getName();//获取解析器当前指向的元素的名称   
  58.                 if("person".equals(name)){   
  59.                     person = new Person();   
  60.                     person.setId(new Integer(parser.getAttributeValue(0)));   
  61.                 }   
  62.                 if(person!=null){   
  63.                     if("name".equals(name)){   
  64.                         person.setName(parser.nextText());//获取解析器当前指向元素的下一个文本节点的值   
  65.                     }   
  66.                     if("age".equals(name)){   
  67.                         person.setAge(new Short(parser.nextText()));   
  68.                     }   
  69.                 }   
  70.                 break;   
  71.             case XmlPullParser.END_TAG:   
  72.                 if("person".equals(parser.getName())){   
  73.                     persons.add(person);   
  74.                     person = null;   
  75.                 }   
  76.                 break;   
  77.             }   
  78.             eventType = parser.next();   
  79.         }   
  80.         return persons;   
  81.     }   
  82. }  
  1. public class PersonServiceTest extends AndroidTestCase {   
  2.     private static final String TAG = "PersonServiceTest";   
  3.        
  4.     public void testPullGetPersons() throws Throwable{   
  5.         InputStream inStream = getClass().getClassLoader().getResourceAsStream("target.xml");   
  6.         List<Person> persons = PULLPersonService.getPersons(inStream);   
  7.         for(Person person : persons){   
  8.             Log.i(TAG, person.toString());   
  9.         }   
  10.     }   
  11.        
  12.     public void testSave() throws Throwable{   
  13.         List<Person> persons = new ArrayList<Person>();   
  14.         persons.add(new Person(34"lili", (short)12));   
  15.         persons.add(new Person(25"mimi", (short)32));   
  16.         persons.add(new Person(33"xixi", (short)40));   
  17.         StringWriter writer = new StringWriter();   
  18.         PULLPersonService.save(persons, writer);   
  19.         Log.i(TAG, writer.toString());   
  20.     }   
  21. }  
public class PersonServiceTest extends AndroidTestCase {
	private static final String TAG = "PersonServiceTest";
	
	public void testPullGetPersons() throws Throwable{
		InputStream inStream = getClass().getClassLoader().getResourceAsStream("target.xml");
		List<Person> persons = PULLPersonService.getPersons(inStream);
		for(Person person : persons){
			Log.i(TAG, person.toString());
		}
	}
	
	public void testSave() throws Throwable{
		List<Person> persons = new ArrayList<Person>();
		persons.add(new Person(34, "lili", (short)12));
		persons.add(new Person(25, "mimi", (short)32));
		persons.add(new Person(33, "xixi", (short)40));
		StringWriter writer = new StringWriter();
		PULLPersonService.save(persons, writer);
		Log.i(TAG, writer.toString());
	}
}

用单元测试运行testPullGetPersons()方法,运行结果如下:

Xml代码 复制代码 收藏代码
  1. Person [age=30id=23name=liming]   
  2. Person [age=25id=20name=lixiangmei]  

 用单元测试运行 testSave()方法,运行结果如下:

Xml代码 复制代码 收藏代码
  1. <?xml version='1.0' encoding='UTF-8' standalone='yes' ?>  
  2. <persons>  
  3.     <person id="34">  
  4.         <name>lili</name>  
  5.         <age>12</age>  
  6.     </person>  
  7.     <person id="25">  
  8.         <name>mimi</name>  
  9.         <age>32</age>  
  10.     </person>  
  11.     <person id="33">  
  12.         <name>xixi</name>  
  13.         <age>40</age>  
  14.     </person>  
  15. </persons>   

 到此完成了用pull技术完成xml的解析,和生成xml文件。 

<script type="text/javascript"></script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script>

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics