一、基本介绍

对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. packagecn.xy.service;
  2. importjava.io.InputStream;
  3. importjava.io.OutputStream;
  4. importjava.util.ArrayList;
  5. importjava.util.List;
  6. importorg.xmlpull.v1.XmlPullParser;
  7. importorg.xmlpull.v1.XmlSerializer;
  8. importandroid.util.Xml;
  9. importcn.xy.model.Person;
  10. publicclassPersonService
  11. {
  12. publicListgetPeople(InputStreamxml)throwsException
  13. {
  14. Listlst=null;
  15. Personperson=null;
  16. //利用ANDROID提供的API快速获得pull解析器
  17. XmlPullParserpullParser=Xml.newPullParser();
  18. //设置需要解析的XML数据
  19. pullParser.setInput(xml,"UTF-8");
  20. //取得事件
  21. intevent=pullParser.getEventType();
  22. //若为解析到末尾
  23. while(event!=XmlPullParser.END_DOCUMENT)//文档结束
  24. {
  25. StringnodeName=pullParser.getName();
  26. switch(event)
  27. {
  28. caseXmlPullParser.START_DOCUMENT://文档开始
  29. lst=newArrayList();
  30. break;
  31. caseXmlPullParser.START_TAG://标签开始
  32. if("person".equals(nodeName))
  33. {
  34. Stringid=pullParser.getAttributeValue(0);
  35. person=newPerson();
  36. person.setId(id);
  37. }
  38. if("name".equals(nodeName))
  39. {
  40. Stringname=pullParser.nextText();
  41. person.setName(name);
  42. }
  43. if("age".equals(nodeName))
  44. {
  45. intage=Integer.valueOf(pullParser.nextText());
  46. person.setAge(age);
  47. }
  48. break;
  49. caseXmlPullParser.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. returnlst;
  60. }
  61. publicvoidsaveDataToXML(OutputStreamos,Listlst)throwsException
  62. {
  63. XmlSerializerxs=Xml.newSerializer();
  64. xs.setOutput(os,"UTF-8");
  65. xs.startDocument("UTF-8",true);
  66. xs.startTag(null,"people");
  67. for(Personp: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. publicclassTestClassextendsAndroidTestCase
  86. {
  87. publicvoidtestPeople()throwsException
  88. {
  89. PersonServiceps=newPersonService();
  90. InputStreamxml=this.getClass().getClassLoader().getResourceAsStream("person.xml");
  91. Listlst=ps.getPeople(xml);
  92. Assert.assertEquals("XY1",lst.get(0).getName());
  93. }
  94. publicvoidtestSave()throwsException
  95. {
  96. PersonServiceps=newPersonService();
  97. Listlst=newArrayList();
  98. lst.add(newPerson("0001","XY0001",20));
  99. lst.add(newPerson("0002","XY0002",20));
  100. FilexmlFile=newFile(this.getContext().getFilesDir(),"xy.xml");//data/data/packagename/files
  101. OutputStreamos=newFileOutputStream(xmlFile);
  102. ps.saveDataToXML(os,lst);
  103. }
  104. }

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

更多相关文章

  1. Android炫酷的3D球型标签云开源库 3dTagCloudAndroid 的使用
  2. Android有望结束碎片化
  3. Android UI--ViewPager扩展Tab标签指示
  4. 如何用Android webview播放HTML5 video标签
  5. 连载二:如何将 Android带入互联网数字家庭?
  6. 开源项目之Android 结束篇
  7. Android中 字符串-数字 的转化
  8. android 数字键盘
  9. android 利用环形菜单制作带数字表盘的时钟

随机推荐

  1. 希望为自己构建一个用于PHP + MySQL开发
  2. php图片上传并重命名图片的功能实现原理
  3. php如何以一个对象作为数组下标?
  4. 过期时间为“会话结束”的Cookie何时到期
  5. PHP打开所有报错
  6. php预定义常量目录分隔符
  7. php-自动过滤、自动填充、自动验证
  8. drupal优化全攻略
  9. 将数据从一个流传输到另一个流
  10. PHP打印输出数组内容及结构函数print_r与