android使用pull解析xml

1.Pull解析器概述

Pull解析和Sax解析很相似,都是轻量级的解析xml工具,在Android的内核中已经嵌入了Pull工具包,所以我们不需要再添加第三方jar包。Pull解析xml文件过程中会触发相应的事件,默认解析完一个标签则不继续往下解析,只有调用next方法,才继续往下解析,根据解析器的getEventType来获得解析对象的类型。

2.Pull解析数据

[java]  view plain copy
  1. /* 
  2.  * MainActivity.java 
  3.  */  
  4. package com.baidu.parsexmltest;  
  5.   
  6. import java.io.File;  
  7. import java.io.FileOutputStream;  
  8. import java.io.InputStream;  
  9. import java.util.ArrayList;  
  10. import java.util.HashMap;  
  11. import java.util.List;  
  12. import java.util.Map;  
  13.   
  14. import android.os.Bundle;  
  15. import android.app.ListActivity;  
  16. import android.widget.ListView;  
  17. import android.widget.SimpleAdapter;  
  18. import android.widget.Toast;  
  19.   
  20. public class MainActivity extends ListActivity {  
  21.     private ListView listView;  
  22.     private List<Person> persons;  
  23.     private List<Map<String, String>> list;  
  24.     private Map<String, String> map;  
  25.     private InputStream is;  
  26.   
  27.     @Override  
  28.     protected void onCreate(Bundle savedInstanceState) {  
  29.         super.onCreate(savedInstanceState);  
  30.         setContentView(R.layout.activity_main);  
  31.           
  32.         listView = this.getListView();      //得到ListView控件,由于继承了ListActivity可以直接得到  
  33.         list = new ArrayList<Map<String,String>>();  
  34.           
  35.         read();     //读取xml文件  
  36.           
  37.         listView.setAdapter(new SimpleAdapter(this, list, R.layout.item,   
  38.                 new String[]{"id""name""age"},   
  39.                 new int[]{R.id.id, R.id.name, R.id.age}));  
  40.           
  41.         save();     //保存xml文件  
  42.     }  
  43.   
  44.     /** 
  45.      * 保存xml文件 
  46.      */  
  47.     public void save() {  
  48.         File file = new File(this.getApplication().getFilesDir(),  
  49.                 "personNew.xml");   //定义file对象,路径为/data/dara/<package name>/files/personNew.xml  
  50.         try {  
  51.             FileOutputStream fos = new FileOutputStream(file);  
  52.             XmlTool.save(persons, fos); //主要保存xml方法  
  53.             Toast.makeText(this, R.string.success, Toast.LENGTH_SHORT).show();//保存成功提示  
  54.             return ;  
  55.               
  56.         } catch (Exception e) {  
  57.             e.printStackTrace();  
  58.         }  
  59.         Toast.makeText(this, R.string.fail, Toast.LENGTH_SHORT).show();     //保存失败提示  
  60.     }  
  61.   
  62.     /* 
  63.      * 读取xml文件 
  64.      */  
  65.     public void read() {  
  66.         try {  
  67.             is = this.getAssets().open("persons.xml");  //打开assets目录中保存的xml文件  
  68.             persons = new XmlTool().parser(is); //主要读取xml文件方法  
  69.             for (Person p : persons) {  
  70.                 map = new HashMap<String, String>();  
  71.                 map.put("id", Integer.toString(p.getId()));  
  72.                 map.put("name", p.getName());  
  73.                 map.put("age", Integer.toString(p.getAge()));  
  74.                 list.add(map);  
  75.             }  
  76.         } catch (Exception e) {  
  77.             e.printStackTrace();  
  78.         }  
  79.     }  
  80. }  
[java]  view plain copy
  1. /** 
  2.  * XmlTool.java 
  3.  * 解析xml文件盒保存xml主要工具 
  4.  */  
  5. package com.baidu.parsexmltest;  
  6.   
  7. import java.io.FileOutputStream;  
  8. import java.io.InputStream;  
  9. import java.util.ArrayList;  
  10. import java.util.List;  
  11.   
  12. import org.xmlpull.v1.XmlPullParser;  
  13. import org.xmlpull.v1.XmlSerializer;  
  14.   
  15. import android.util.Xml;  
  16.   
  17. public class XmlTool {  
  18.     private List<Person> persons;  
  19.     Person person = null;  
  20.     /** 
  21.      * 解析xml文件 
  22.      * @param in    字节输入流 
  23.      * @return  返回list集合 
  24.      * @throws Exception 
  25.      */  
  26.     public List<Person> parser(InputStream in) throws Exception {  
  27.         /* 
  28.          * XmlPullParser解析xml文件,读完相应的标签后会触发相应的事件! 
  29.          * 对一个xml文件读取存在5种类型 
  30.          *      <?xml version="1.0" encoding="utf-8"?>    //StartDocument 
  31.          *      <person>      //StartTag 
  32.          *          info        //Text 
  33.          *      </person>     //EndTag 
  34.          *                      //EndDocument 
  35.          * 默认读完一个标签后,不再继续往下读取,只有执行解析器的next方法,才会继续往下执行解析操作 
  36.          */  
  37.          //  1.创建一个xml解析的工厂
  38. XmlPullParserFactory factory=XmlPullParserFactory.newInstance();  
  39.   
  40.         //  2.获得xml解析类的引用
  41.         XmlPullParser parser = factory.newPullParser();  
  42.         //  3.设定解析器读取的字节流对象,含有编码方式  
  43.         parser.setInput(in, "UTF-8");  
  44.         //  4.得到解析返回的事件类型  
  45.         int type = parser.getEventType();  
  46.         //  5.根据事件类型,进行选择操作  
  47.         while(type !=  XmlPullParser.END_DOCUMENT){  //判断没有到文件的末尾就进行循环操作
  48.             switch (type) {  
  49.             case XmlPullParser.START_DOCUMENT:  //主要完成初始化动作  
  50.                 persons = new ArrayList<Person>();  
  51.                 break;  
  52.             case XmlPullParser.START_TAG:       //开始标签,完成数据操作  
  53.                 if("person".equals(parser.getName())){  
  54.                     person = new Person();  
  55.                     person.setId(Integer.parseInt(parser.getAttributeValue(0)));    //这里由于id直接跟person在一个标签里面写着,所用getAttributeValue(0)表示获得第一个属性的值。例子<person id=1>
  56.                 } else if("name".equals(parser.getName())){  
  57.                     person.setName(parser.nextText());  //可以直接获得文本标签信息  
  58.                 } else if("age".equals(parser.getName())){  
  59.                     person.setAge(Integer.parseInt(parser.nextText()));  
  60.                 }  
  61.                 break;  
  62.             case XmlPullParser.END_TAG:         //结束标签  
  63.                 if("person".equals(parser.getName())){  
  64.                     persons.add(person);  
  65.                 }  
  66.                 break;  
  67.             }  
  68.             type = parser.next();               //下一个标签,默认读完该标签不再继续往下执行读取操作  
  69.         }  
  70.         return persons;  
  71.     }  
  72.       
  73.     /** 
  74.      * 保存xml文件 
  75.      * @param list  list集合对象 
  76.      * @param fos   输出流对象 
  77.      * @throws Exception 
  78.      */  
  79.     public static void save(List<Person> list, FileOutputStream fos) throws Exception{  
  80.         //  1.定义Xml序列器  
  81.         XmlSerializer serializer = Xml.newSerializer();  
  82.         //  2.为该序列器对象设定输出流  
  83.         serializer.setOutput(fos, "UTF-8");  
  84.         //  3.xml写入信息  
  85.         serializer.startDocument("UTF-8"true);    //能否单独存在  
  86.         serializer.startTag(null"persons");       //第一个参数为命名空间  
  87.           
  88.         for(Person person:list){  
  89.             serializer.startTag(null"person");  
  90.             serializer.attribute(null"id", Integer.toString(person.getId()));//赋予属性信息  
  91.               
  92.             serializer.startTag(null"name");  
  93.             serializer.text(person.getName());  
  94.             serializer.endTag(null"name");  
  95.               
  96.             serializer.startTag(null"age");  
  97.             serializer.text(Integer.toString(person.getAge()));  
  98.             serializer.endTag(null"age");  
  99.               
  100.             serializer.endTag(null"person");  
  101.         }  
  102.           
  103.         serializer.endTag(null"persons");  
  104.         serializer.endDocument();       //文档结束  
  105.         fos.flush();  
  106.         fos.close();  
  107.         return;  
  108.     }  
  109. }  
[java]  view plain copy
  1. /* 
  2.  * Person.java 
  3.  */  
  4.   
  5. package com.baidu.parsexmltest;  
  6. public class Person {  
  7.     private int id;  
  8.     private String name;  
  9.     private int age;  
  10.     public int getId() {  
  11.         return id;  
  12.     }  
  13.     public void setId(int id) {  
  14.         this.id = id;  
  15.     }  
  16.     public String getName() {  
  17.         return name;  
  18.     }  
  19.     public void setName(String name) {  
  20.         this.name = name;  
  21.     }  
  22.     public int getAge() {  
  23.         return age;  
  24.     }  
  25.     public void setAge(int age) {  
  26.         this.age = age;  
  27.     }  
  28. }  
[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <!-- ListView布局  item.xml -->  
  3. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="40sp"  
  6.     android:orientation="horizontal" >  
  7.   
  8.     <TextView android:layout_width="match_parent"  
  9.         android:layout_height="match_parent"  
  10.         android:layout_weight="1"  
  11.         android:gravity="center_vertical"  
  12.         android:textSize="16sp"  
  13.         android:id="@+id/id"/>  
  14.     <TextView android:layout_width="match_parent"  
  15.         android:layout_height="match_parent"  
  16.         android:gravity="center_vertical"  
  17.         android:layout_weight="1"  
  18.         android:textSize="16sp"  
  19.         android:id="@+id/name"/>  
  20.     <TextView android:layout_width="match_parent"  
  21.         android:layout_height="match_parent"  
  22.         android:gravity="center_vertical"  
  23.         android:layout_weight="1"  
  24.         android:textSize="16sp"  
  25.         android:id="@+id/age"/>  
  26.       
  27. </LinearLayout>  

3.更新xml文件

如果只是简单的生成xml文件,则可以使用pull方式的Xml.newSerializer()去生成一个xml文档很方便,但是对其修改很麻烦。如果只为修改xml文件,可以参考dom解析方式,添加或者移除一个节点。


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值