Android入门:Pull解析XML

一、Pull解析器介绍


pull解析类似于SAX\DOM,都是用来解析XML的方法;


二、使用Pull解析器读取XML数据


模板代码如下:

  1. XmlPullParser parser = Xml.newPullParser();   //创建一个PULL解析器  
  2. parser.setInput(in,"UTF-8");      //读取的编码为UTF-8  
  3. int event = parser.getEventType();   //开始解析时调用  
  4. while(event!=XmlPullParser.END_DOCUMENT){  
  5.     //parser.getName();   //获得当前指向的标签的标签名  
  6.     //parser.getAttributeValue(0);  //获得当前指向的标签的第1个属性值  
  7.     //parser.nextText(); //获得当前标签的标签值  
  8.     switch(event){  
  9.         case XmlPullParser.START_DOCUMENT: //如果指向的是START_DOCUMENT  
  10.         //处理  
  11.         break;  
  12.         case XmlPullParser.START_TAG:    //如果指向的是START_TAG  
  13.         //处理  
  14.         break;  
  15.         case XmlPullParser.END_TAG:     //如果指向的是END_TAG  
  16.         //处理  
  17.         break;  
  18.     }  
  19.     event = parser.next();     //指向下一个标签  
  20. }  


应用:读取/data/data/package/files/目录下的person.xml文件


XML文件如下:

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <persons>  
  3.     <person id="1">  
  4.         <name>xiazdong-1</name>  
  5.         <age>20</age>  
  6.     </person>  
  7.     <person id="2">  
  8.         <name>xiazdong-2</name>  
  9.         <age>30</age>  
  10.     </person>  
  11. </persons>  

从上面可以看出,<person></person>可以看做一个JavaBean,而<persons></persons>组成了一个person队列;

因此我们创建一个Person的JavaBean:

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

接下来,我们编写如下readXML方法,使得将XML文件中的数据变成一个person队列;
  1. public class XmlService {  
  2. <span style="white-space:pre">  </span>public List<Person> readXml(InputStream in) throws Exception {  
  3.         XmlPullParser parser = Xml.newPullParser();  
  4.         parser.setInput(in, "UTF-8");  
  5.         List<Person> list = null;  
  6.         Person person = null;  
  7.         int event = parser.getEventType();  //开始解析,并获取事件  
  8.         /* 
  9.          * 可选事件包括: 
  10.          * (1)START_DOCUMENT 
  11.          * (2)END_DOCUMENT 
  12.          * (3)START_TAG 
  13.          * (4)END_TAG 
  14.          * */  
  15.         while (event != XmlPullParser.END_DOCUMENT) {  
  16.             switch (event) {  
  17.             case XmlPullParser.START_DOCUMENT:  
  18.                 list = new ArrayList<Person>();  
  19.                 break;  
  20.             case XmlPullParser.START_TAG:  
  21.                 if ("person".equals(parser.getName())) {  
  22.                     person = new Person();  
  23.                     int id = Integer.parseInt(parser.getAttributeValue(0));  
  24.                     person.setId(id);  
  25.                 }  
  26.                 if("name".equals(parser.getName())){  
  27.                     person.setName(parser.nextText());  
  28.                 }  
  29.                 if("age".equals(parser.getName())){  
  30.                     person.setAge(Integer.parseInt(parser.nextText()));  
  31.                 }  
  32.                 break;  
  33.             case XmlPullParser.END_TAG:  
  34.                 if("person".equals(parser.getName()))  
  35.                     list.add(person);  
  36.                 break;  
  37.             }  
  38.             event = parser.next();  //读取下一个  
  39.         }  
  40.         return list;  
  41.     }  
  42. }  

编写好此方法之后,我们可以测试此方法:
  1. public class XmlTest extends AndroidTestCase{  
  2.     private static final String TAG = "XmlTest";  
  3.     public void testRead() throws Exception{  
  4.         XmlService service = new XmlService();  
  5.         List<Person> list = service.readXml(this.getContext().openFileInput("person.xml"));  
  6.         Log.i(TAG, String.valueOf(list.size()));  
  7.         for(Person p:list){  
  8.             Log.i(TAG, p.toString());  
  9.         }  
  10.     }  
  11. }  


运行效果如下:




三、使用Serializer解析器写入XML文件


核心代码如下:

  1. XmlSerializer serializer = Xml.newSerializer();    //创建一个Serializer解析器  
  2. serializer.setOutput(out,"utf-8");      //设置输出流及输出的编码为UTF-8  
  3. serializer.startDocument("UTF-8",true);   //输出开始文档<?xml version="1.0" encoding="UTF-8" standalone="true"?>  
  4. serializer.startTag(null,"tagname");   //输出<tagname>  
  5. serializer.attribute(null,"name","value");  //输出<tagname name="value">  
  6. serializer.text("value");    //输出<tagname></tagname>  
  7. serializer.endTag(null,"tagname");//结束标签  
  8. serializer.endDocument();//结束文档  

应用:创建上面提到的person.xml文件到/data/data/package/files中



以下代码用于将person队列写入输出流文件(此处为文件输出流)
  1. <span style="white-space:pre">public class XmlService { </span>  
  2. <span style="white-space:pre">  </span>public void writeXml(List<Person> list,OutputStream out)throws Exception{  
  3.         XmlSerializer serializer = Xml.newSerializer();  
  4.         serializer.setOutput(out, "UTF-8");  
  5.         serializer.startDocument("UTF-8"true);  
  6.         serializer.startTag(null"persons");  
  7.         for(Person p:list){  
  8.             serializer.startTag(null,"person");  
  9.             serializer.attribute(null"id", String.valueOf(p.getId()));  
  10.             serializer.startTag(null"name");  
  11.             serializer.text(p.getName());  
  12.             serializer.endTag(null"name");  
  13.             serializer.startTag(null"age");  
  14.             serializer.text(p.getAge()+"");  
  15.             serializer.endTag(null"age");  
  16.             serializer.endTag(null"person");  
  17.         }  
  18.         serializer.endTag(null"persons");  
  19.         serializer.endDocument();  
  20.         out.flush();  
  21.         out.close();  
  22.     }  
  23. }  


测试代码如下:
  1. <span style="white-space:pre">public class XmlTest extends AndroidTestCase{ </span>  
  2. <span style="white-space:pre">  </span>public void testWrite()throws Exception{  
  3.         XmlService service = new XmlService();  
  4.         List<Person> list = new ArrayList<Person>();  
  5.         for(int i=0;i<3;i++){  
  6.             Person p = new Person();  
  7.             p.setId(i);  
  8.             p.setName("xiazdong-"+i);  
  9.             p.setAge(20+i);  
  10.             list.add(p);  
  11.         }  
  12.         OutputStream out = this.getContext().openFileOutput("person.xml", Context.MODE_PRIVATE);  
  13.         service.writeXml(list, out);  
  14.     }  
  15. }  

总结:使用Pull解析器读取,使用Serializer写入;







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值