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

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

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

Xml代码
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <persons>
  3. <personid="23">
  4. <name>liming</name>
  5. <age>30</age>
  6. </person>
  7. <personid="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-libraryandroid:name="android.test.runner"/>

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

Xml代码
  1. <instrumentationandroid:name="android.test.InstrumentationTestRunner"android:targetPackage="你的测试文件所在的包名"android:label="TestsforMyApp"/>

Java代码
  1. publicclassPerson{
  2. privateIntegerid;
  3. privateStringname;
  4. privateShortage;
  5. publicPerson(){}//无参构造器
  6. publicPerson(Integerid,Stringname,Shortage){
  7. this.id=id;
  8. this.name=name;
  9. this.age=age;
  10. }
  11. publicIntegergetId(){
  12. returnid;
  13. }
  14. publicvoidsetId(Integerid){
  15. this.id=id;
  16. }
  17. publicStringgetName(){
  18. returnname;
  19. }
  20. publicvoidsetName(Stringname){
  21. this.name=name;
  22. }
  23. publicShortgetAge(){
  24. returnage;
  25. }
  26. publicvoidsetAge(Shortage){
  27. this.age=age;
  28. }
  29. @Override
  30. publicStringtoString(){
  31. return"Person[age="+age+",id="+id+",name="+name+"]";
  32. }
  33. }

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

Java代码
  1. /**
  2. *采用Pull解析XML内容
  3. */
  4. publicclassPULLPersonService{
  5. /**
  6. *使用pull技术生成xml文件
  7. *@parampersons
  8. *@paramwriter
  9. *@throwsThrowable
  10. */
  11. publicstaticvoidsave(List<Person>persons,Writerwriter)throwsThrowable{
  12. XmlSerializerserializer=Xml.newSerializer();
  13. serializer.setOutput(writer);
  14. serializer.startDocument("UTF-8",true);
  15. serializer.startTag(null,"persons");
  16. for(Personperson:persons){
  17. serializer.startTag(null,"person");
  18. serializer.attribute(null,"id",person.getId().toString());
  19. serializer.startTag(null,"name");
  20. serializer.text(person.getName());
  21. serializer.endTag(null,"name");
  22. serializer.startTag(null,"age");
  23. serializer.text(person.getAge().toString());
  24. serializer.endTag(null,"age");
  25. serializer.endTag(null,"person");
  26. }
  27. serializer.endTag(null,"persons");
  28. serializer.endDocument();
  29. writer.flush();
  30. writer.close();
  31. }
  32. /**
  33. *使用pull技术解析xml
  34. *@paraminStream
  35. *@return
  36. *@throwsThrowable
  37. */
  38. publicstaticList<Person>getPersons(InputStreaminStream)throwsThrowable{
  39. List<Person>persons=null;
  40. Personperson=null;
  41. XmlPullParserparser=Xml.newPullParser();
  42. parser.setInput(inStream,"UTF-8");
  43. inteventType=parser.getEventType();//产生第一个事件
  44. while(eventType!=XmlPullParser.END_DOCUMENT){//只要不是文档结束事件
  45. switch(eventType){
  46. caseXmlPullParser.START_DOCUMENT:
  47. persons=newArrayList<Person>();
  48. break;
  49. caseXmlPullParser.START_TAG:
  50. Stringname=parser.getName();//获取解析器当前指向的元素的名称
  51. if("person".equals(name)){
  52. person=newPerson();
  53. person.setId(newInteger(parser.getAttributeValue(0)));
  54. }
  55. if(person!=null){
  56. if("name".equals(name)){
  57. person.setName(parser.nextText());//获取解析器当前指向元素的下一个文本节点的值
  58. }
  59. if("age".equals(name)){
  60. person.setAge(newShort(parser.nextText()));
  61. }
  62. }
  63. break;
  64. caseXmlPullParser.END_TAG:
  65. if("person".equals(parser.getName())){
  66. persons.add(person);
  67. person=null;
  68. }
  69. break;
  70. }
  71. eventType=parser.next();
  72. }
  73. returnpersons;
  74. }
  75. }
  1. publicclassPersonServiceTestextendsAndroidTestCase{
  2. privatestaticfinalStringTAG="PersonServiceTest";
  3. publicvoidtestPullGetPersons()throwsThrowable{
  4. InputStreaminStream=getClass().getClassLoader().getResourceAsStream("target.xml");
  5. List<Person>persons=PULLPersonService.getPersons(inStream);
  6. for(Personperson:persons){
  7. Log.i(TAG,person.toString());
  8. }
  9. }
  10. publicvoidtestSave()throwsThrowable{
  11. List<Person>persons=newArrayList<Person>();
  12. persons.add(newPerson(34,"lili",(short)12));
  13. persons.add(newPerson(25,"mimi",(short)32));
  14. persons.add(newPerson(33,"xixi",(short)40));
  15. StringWriterwriter=newStringWriter();
  16. PULLPersonService.save(persons,writer);
  17. Log.i(TAG,writer.toString());
  18. }
  19. }
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=30,id=23,name=liming]
  2. Person[age=25,id=20,name=lixiangmei]

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

Xml代码
  1. <?xmlversion='1.0'encoding='UTF-8'standalone='yes'?>
  2. <persons>
  3. <personid="34">
  4. <name>lili</name>
  5. <age>12</age>
  6. </person>
  7. <personid="25">
  8. <name>mimi</name>
  9. <age>32</age>
  10. </person>
  11. <personid="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>

更多相关文章

  1. Android多渠道打包之Python打包
  2. android中对sd卡文件的管理
  3. Mac OSX Android源码编译-环境搭建、源码下载、源码编译、导入An
  4. 如何实现在 Android(安卓)Studio 上开发系统应用(自带系统签名)
  5. gRPC在Android中的应用、配置、生成文件及登录实现
  6. Android(安卓)XML文件链接错误
  7. 【Android】SQLiteOpenHelper类(sql语句实现增删改查),封装SQLite
  8. Android(安卓)Studio 新建一个简单的Jni-demo,实现了so库的生成与
  9. 【Android】【学习笔记】运行时资源替换-Runtime Resource Overl

随机推荐

  1. Android反射机制实例
  2. Android 中文 API (19) —— TwoLineListIt
  3. Android(安卓)Screen Monitor抓取真机屏
  4. Android使用SQLite数据库的示例
  5. Android Studio配置google protobuf
  6. Android访问WCF(下篇)-客户端开发
  7. Android的webView应用与js互调app混合开
  8. Android——Jni使用总结
  9. Android 获取当前日期 时间很方便 直接调
  10. android 4.0 NetworkOnMainThreadExcepti