android利用XmlPullParse对XML进行解析读取(1) + (2) 总结

(1)

       PULL解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使用,Android系统内部在解析各种XML时也是用PULL解析器,Android官方推荐开发者们使用Pull解析技术。Pull解析技术是第三方开发的开源技术,它同样可以应用于JavaSE开发。

      PULL 的工作原理:XML pull提供了开始元素和结束元素。当某个元素开始时,我们可以调用parser.nextText从XML文档中提取所有字符数据。当解释到一个文档结束时,自动生成EndDocument事件。

      常用的XML pull的接口和类:

XmlPullParser:XML pull解析器是一个在XMLPULL VlAP1中提供了定义解析功能的接口。

XmlSerializer:它是一个接口,定义了XML信息集的序列。

XmlPullParserFactory:这个类用于在XMPULL V1 API中创建XML Pull解析器。

XmlPullParserException:抛出单一的XML pull解析器相关的错误。

这是我自己建的一个xml文件person.xml

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <persons>  
  3.     <person id="1">  
  4.         <name>小明</name>  
  5.         <age>25</age>  
  6.     </person>  
  7.     <person id="2">  
  8.         <name>哈哈</name>  
  9.         <age>76</age>  
  10.     </person>  
  11. </persons>  
大家注意一下我存放XML的位置



好了,现在的目的就是把person.xml里的内容解析出来,看一下xml内容利用我们的面向对象的知识,我们需要建立一个实体类来存放解析出来的信息

所以先来建立一个Person类。



  1. package com.wjg.xml.entity;  
  2.   
  3. public class Person {  
  4.     public Person() {  
  5.         super();  
  6.     }  
  7.     public Person(Integer id, String name, Integer age) {  
  8.         super();  
  9.         this.id = id;  
  10.         this.name = name;  
  11.         this.age = age;  
  12.     }  
  13.     private Integer id;  
  14.     private String name;  
  15.     private Integer age;  
  16.     public Integer getId() {  
  17.         return id;  
  18.     }  
  19.     public void setId(Integer id) {  
  20.         this.id = id;  
  21.     }  
  22.     public String getName() {  
  23.         return name;  
  24.     }  
  25.     public void setName(String name) {  
  26.         this.name = name;  
  27.     }  
  28.     public Integer getAge() {  
  29.         return age;  
  30.     }  
  31.     public void setAge(Integer age) {  
  32.         this.age = age;  
  33.     }  
  34.     @Override  
  35.     public String toString() {  
  36.         return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";  
  37.     }  
  38.       
  39.       
  40. }  

好了,实体类建好之后需要开始解析xml的步骤,建一个Service(这里其实应该抽象出一个接口来,让自己写的service实现这个接口,懒得写了。呵呵)
  1. package com.wjg.xml.service;  
  2.   
  3. import java.io.InputStream;  
  4. import java.util.ArrayList;  
  5. import java.util.List;  
  6.   
  7. import org.xmlpull.v1.XmlPullParser;  
  8. import org.xmlpull.v1.XmlPullParserFactory;  
  9.   
  10. import android.util.Xml;  
  11.   
  12. import com.wjg.xml.entity.Person;  
  13.   
  14. public  class PollXmlService {  
  15.     public  static final List<Person> readXml(InputStream xml) throws Exception{  
  16.         //通过XmlPullParserFactory获取XmlPullParser对象  
  17.         //XmlPullParserFactory factory=XmlPullParserFactory.newInstance();  
  18.         //XmlPullParser xParser=factory.newPullParser();  
  19.           
  20.         XmlPullParser xmlPullParser=Xml.newPullParser();  
  21.         //为Pull解析器设置输入流和编码格式  
  22.         xmlPullParser.setInput(xml, "UTF-8");  
  23.         //获取XMl读取的位置  
  24.         int eventType=xmlPullParser.getEventType();  
  25.           
  26.         List<Person> persons=null;  
  27.         Person person=null;  
  28.         while(eventType!=XmlPullParser.END_DOCUMENT){  
  29.             switch (eventType) {  
  30.             case XmlPullParser.START_DOCUMENT:  
  31.                 persons=new ArrayList<Person>();  
  32.                 break;  
  33.             case XmlPullParser.START_TAG:  
  34.                 if(xmlPullParser.getName().equals("person")){  
  35.                     person=new Person();  
  36.                     person.setId(Integer.parseInt(xmlPullParser.getAttributeValue(0)));  
  37.                 }else if(xmlPullParser.getName().equals("name")){  
  38.                     person.setName(xmlPullParser.nextText());  
  39.                 }else if(xmlPullParser.getName().equals("age")){  
  40.                     person.setAge(Integer.parseInt(xmlPullParser.nextText()));  
  41.                 }  
  42.                 break;  
  43.             case XmlPullParser.END_TAG:  
  44.                 if(xmlPullParser.getName().equals("person")){  
  45.                     persons.add(person);  
  46.                     person=null;  
  47.                 }  
  48.                 break;  
  49.             case XmlPullParser.END_DOCUMENT:  
  50.                 xml.close();  
  51.             }  
  52.             eventType=xmlPullParser.next();  
  53.         }  
  54.         return persons;  
  55.     }  
  56. }  

方法写完了,咱们来测试一下。在项目清单文件中添加测试库。



建立测试类

  1. package com.wjg.xml.test;  
  2.   
  3. import java.io.InputStream;  
  4. import java.util.List;  
  5. import android.test.AndroidTestCase;  
  6. import android.util.Log;  
  7. import com.wjg.xml.entity.Person;  
  8. import com.wjg.xml.service.PollXmlService;  
  9.   
  10. public class TestXml extends AndroidTestCase{  
  11.     private final static String TAG="TestXml";  
  12.     public void testReadXml() throws Exception{  
  13.         /** 
  14.          * xml文件放在src目录下,编译时会放在类路径下,所以通过类加载器的getResouceAsStream方法 
  15.          * 可获得文件的输入流 
  16.          */  
  17.         InputStream is=this.getContext().getClassLoader().getResourceAsStream("person.xml");  
  18.         //调用方法,执行读取操作  
  19.         List<Person> persons=PollXmlService.readXml(is);  
  20.         for (Person person : persons) {  
  21.             //LogCat控制台输出person信息  
  22.             Log.i(TAG, person.toString());  
  23.         }  
  24.     }  
  25. }  

现在右击测试方法,选择Android JunitTest,切换到DDMS控制台。查看LogCat输入的日志



成功了,PULL解析XML文件就是这么简单(LogCat控制台我使用了过滤器,过滤我定义的Tag,所以只显示我想看到的信息)。

上面我们涉及到了利用Pull解析器对xml进行解析,转换为LIst对象。

(2)

这篇呢,来看一下PULL解析器如何将LIst<Person>序列化到XML文件中去在上篇的PollXmlService中加入一个方法

我们需要一个LIst对象和一个输出流

  1. /** 
  2.      * 将List<Person>对象序列化到xml中 
  3.      * @param persons 
  4.      * @param ops 
  5.      * @throws Exception 
  6.      */  
  7.     public final static void exportXml(List<Person> persons,OutputStream ops)throws Exception{  
  8.         //创建xml序列化器  
  9.         XmlSerializer xs=Xml.newSerializer();  
  10.         //设置输出流  
  11.         xs.setOutput(ops, "UTF-8");  
  12.         //创建xml开始文档节点  
  13.         xs.startDocument("UTF-8"true);  
  14.         xs.startTag(null,"persons");  
  15.         for (Person person : persons) {  
  16.             xs.startTag(null,"person");  
  17.             xs.attribute(null"id", person.getId().toString());  
  18.               
  19.             xs.startTag(null"name");  
  20.             xs.text(person.getName());  
  21.             xs.endTag(null"name");  
  22.               
  23.             xs.startTag(null"age");  
  24.             xs.text(person.getAge().toString());  
  25.             xs.endTag(null"age");  
  26.             xs.endTag(null"person");  
  27.         }  
  28.         xs.endTag(null"persons");  
  29.         xs.endDocument();  
  30.         ops.flush();  
  31.         ops.close();  
  32.     }  

好了。现在开始测试,在上次的测试类中加入一个测试方法
  1. public void testExportXml() throws Exception{  
  2.         List<Person> persons=new ArrayList<Person>();  
  3.         persons.add(new Person(1,"你妹",25));  
  4.         persons.add(new Person(2,"呵呵",12));  
  5.         persons.add(new Person(3,"哈哈",43));  
  6.         persons.add(new Person(4,"嘿嘿",56));  
  7.         File file=new File(this.getContext().getFilesDir().getAbsoluteFile()+"/testpersons.xml");  
  8.         FileOutputStream fos=new FileOutputStream(file);  
  9.         PollXmlService.exportXml(persons, fos);  
  10.     }  

执行Android Junit Test

来看一下我们自定义的文件testpersons.xml文件生成了


把xml导出到桌面上,打开看一下

  1. <?xml version='1.0' encoding='UTF-8' standalone='yes' ?>  
  2. <persons><person id="1"><name>你妹</name><age>25</age></person>  
  3.     <person id="2"><name>呵呵</name><age>12</age></person>  
  4.     <person id="3"><name>哈哈</name><age>43</age></person>  
  5.     <person id="4"><name>嘿嘿</name><age>56</age></person>  
  6. </persons> 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值