Android开发8――利用pull解析器读写XML文件


一、基本介绍

对XML解析有SAX和DOM等多种方式,Android中极力推荐xmlpull方式解析xml。xmlpull不仅可用在Android上同样也适用于javase,但在javase环境中需自己获取xmlpull所依赖的类库,kxml2-2.3.0.jar,xmlpull_1_1_3_4c.jar。

jar包下载网址
http://www.xmlpull.org/
http://kxml.sourceforge.net/

二、例子

读取到xml的声明返回数字0 START_DOCUMENT;
读取到xml的结束返回数字1 END_DOCUMENT ;
读取到xml的开始标签返回数字2 START_TAG
读取到xml的结束标签返回数字3 END_TAG
读取到xml的文本返回数字4 TEXT


  1. <?xmlversion="1.0"encoding="UTF-8"?>

  2. <people>

  3. <personid="001">

  4. <name>XY1</name>

  5. <age>22</age>

  6. </person>

  7. <personid="002">

  8. <name>XY2</name>

  9. <age>22</age>

  10. </person>

  11. </people>



  1. package cn.xy.service;  

  2. import java.io.InputStream;  

  3. import java.io.OutputStream;  

  4. import java.util.ArrayList;  

  5. import java.util.List;  

  6. import org.xmlpull.v1.XmlPullParser;  

  7. import org.xmlpull.v1.XmlSerializer;  

  8. import android.util.Xml;  

  9. import cn.xy.model.Person;  

  10. publicclass PersonService  

  11. {  

  12. public List getPeople(InputStream xml) throws Exception  

  13. {  

  14.  List lst = null;  

  15.  Person person = null;  

  16. // 利用ANDROID提供的API快速获得pull解析器

  17.  XmlPullParser pullParser = Xml.newPullParser();  

  18. // 设置需要解析的XML数据

  19.  pullParser.setInput(xml, "UTF-8");  

  20. // 取得事件

  21. int event = pullParser.getEventType();  

  22. // 若为解析到末尾

  23. while (event != XmlPullParser.END_DOCUMENT) // 文档结束

  24.  {  

  25.   String nodeName = pullParser.getName();  

  26. switch (event)  

  27.   {  

  28. case XmlPullParser.START_DOCUMENT: // 文档开始

  29.     lst = new ArrayList();  

  30. break;  

  31. case XmlPullParser.START_TAG: // 标签开始

  32. if ("person".equals(nodeName))  

  33.     {  

  34.      String id = pullParser.getAttributeValue(0);  

  35.      person = new Person();  

  36.      person.setId(id);  

  37.     }  

  38. if ("name".equals(nodeName))  

  39.     {  

  40.      String name = pullParser.nextText();  

  41.      person.setName(name);  

  42.     }  

  43. if ("age".equals(nodeName))  

  44.     {  

  45. int age = Integer.valueOf(pullParser.nextText());  

  46.      person.setAge(age);  

  47.     }  

  48. break;  

  49. case XmlPullParser.END_TAG: // 标签结束

  50. if ("person".equals(nodeName))  

  51.     {  

  52.      lst.add(person);  

  53.      person = null;  

  54.     }  

  55. break;  

  56.   }  

  57.   event = pullParser.next(); // 下一个标签

  58.  }  

  59. return lst;  

  60. }  

  61. publicvoid saveDataToXML(OutputStream os, List lst) throws Exception  

  62. {  

  63.  XmlSerializer xs = Xml.newSerializer();  

  64.  xs.setOutput(os, "UTF-8");  

  65.  xs.startDocument("UTF-8", true);  

  66.  xs.startTag(null, "people");  

  67. for (Person p : lst)  

  68.  {  

  69.   xs.startTag(null, "person");  

  70.   xs.attribute(null, "person", p.getId());  

  71.   xs.startTag(null, "name");  

  72.   xs.text(p.getName());  

  73.   xs.endTag(null, "name");  

  74.   xs.startTag(null, "age");  

  75.   xs.text(p.getAge().toString());  

  76.   xs.endTag(null, "age");  

  77.   xs.endTag(null, "person");  

  78.  }  

  79.  xs.endTag(null, "people");  

  80.  xs.endDocument();  

  81.  os.flush();  

  82.  os.close();  

  83. }  

  84. }  

  85. publicclass TestClass extends AndroidTestCase  

  86. {  

  87. publicvoid testPeople() throws Exception  

  88. {  

  89.  PersonService ps = new PersonService();  

  90.  InputStream xml = this.getClass().getClassLoader().getResourceAsStream("person.xml");  

  91.  List lst = ps.getPeople(xml);  

  92.  Assert.assertEquals("XY1", lst.get(0).getName());  

  93. }  

  94. publicvoid testSave() throws Exception  

  95. {  

  96.  PersonService ps = new PersonService();  

  97.  List lst = new ArrayList();  

  98.  lst.add(new Person("0001", "XY0001", 20));  

  99.  lst.add(new Person("0002", "XY0002", 20));  

  100.  File xmlFile = new File(this.getContext().getFilesDir(), "xy.xml"); // data/data/package name/files

  101.  OutputStream os = new FileOutputStream(xmlFile);  

  102.  ps.saveDataToXML(os, lst);  

  103. }  

  104. }  


本文参考自金旭亮老师的《.NET 4.0面向对象编程漫谈》有关代理的内容

本文出自 “IT徐胖子的专栏” 博客,请务必保留此出处http://woshixy.blog.51cto.com/5637578/1079595


你可能感兴趣的:(android,开发,pull解析器读写XML文件)