打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
XML解析之

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>limingname>  
  5.         age>30age>  
  6.     person>  
  7.     person id='20'>  
  8.         name>lixiangmeiname>  
  9.         age>25age>  
  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' />  

同样我们使用一个bean类来作为数据的接收,Person.java

 

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 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 getPersons(InputStream inStream) throws Throwable{  
  45.         List 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();  
  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. }  

 测试类:PersonServiceTest.java

Java代码  
  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 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 persons = new ArrayList();  
  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. }  

用单元测试运行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>liliname>  
  5.         age>12age>  
  6.     person>  
  7.     person id='25'>  
  8.         name>miminame>  
  9.         age>32age>  
  10.     person>  
  11.     person id='33'>  
  12.         name>xixiname>  
  13.         age>40age>  
  14.     person>  
  15. persons>   

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

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Android解析XML文件的三方法
Android XML解析--中国移动开发者社区
7.2.1 Android XML数据解析
Android笔试总结
使用Pull方法生成一个XML?并解析
Android使用Pull解析器解析XML文件
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服