使用Pull解析器生成XML文件和读取xml文件

【背景】

有些时候,我们需要生成一个XML文件,生成XML文件的方法有很多,如:可以只使用一个StringBuilder组拼XML内容,然后把内容写入到文件中;或者使用DOM API生成XML文件,或者也可以使用pull解析器生成XML文件,这里推荐大家使用Pull解析器。

【Demo源码】

一、布局界面

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:paddingBottom="@dimen/activity_vertical_margin"  
  6.     android:paddingLeft="@dimen/activity_horizontal_margin"  
  7.     android:paddingRight="@dimen/activity_horizontal_margin"  
  8.     android:paddingTop="@dimen/activity_vertical_margin"  
  9.     tools:context=".MainActivity" >  
  10.   
  11.     <Button  
  12.         android:id="@+id/btn_pull"  
  13.         android:layout_width="wrap_content"  
  14.         android:layout_height="wrap_content"  
  15.         android:layout_alignParentLeft="true"  
  16.         android:layout_alignParentRight="true"  
  17.         android:layout_alignParentTop="true"  
  18.         android:layout_marginTop="110dp"  
  19.         android:text="@string/btn_pull" />  
  20.   
  21.     <Button  
  22.         android:id="@+id/btn_write"  
  23.         android:layout_width="wrap_content"  
  24.         android:layout_height="wrap_content"  
  25.         android:layout_alignLeft="@+id/btn_pull"  
  26.         android:layout_alignRight="@+id/btn_pull"  
  27.         android:layout_below="@+id/btn_pull"  
  28.         android:layout_marginTop="61dp"  
  29.         android:text="@string/btn_write" />  
  30.   
  31. </RelativeLayout>  


二、写一个xml文件

[html]
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <persons>  
  3.     <person id="23">  
  4.         <name>李明</name>  
  5.         <age>30</age>  
  6.     </person>  
  7.     <person id="20">  
  8.         <name>李向梅</name>  
  9.         <age>25</age>  
  10.     </person>  
  11. </persons>  


三、写一个和xml相对应的bean

  1. package com.example.lession04_pull.domain;  
  2. import java.io.Serializable;  
  3. public class Person implements Serializable{  

  4.     /** 
  5.      *  
  6.      */  
  7.     private static final long serialVersionUID = 1L;  
  8.     private int id;  
  9.     private String name;  
  10.     private short age;  
  11.     public int getId() {  
  12.         return id;  
  13.     }  
  14.     public void setId(int id) {  
  15.         this.id = id;  
  16.     }  
  17.     public String getName() {  
  18.         return name;  
  19.     }  
  20.     public void setName(String name) {  
  21.         this.name = name;  
  22.     }  
  23.     public short getAge() {  
  24.         return age;  
  25.     }  
  26.     public void setAge(short age) {  
  27.         this.age = age;  
  28.     }  
  29.     public Person(int id, String name, short age) {  
  30.         super();  
  31.         this.id = id;  
  32.         this.name = name;  
  33.         this.age = age;  
  34.     }  
  35.     public Person() {  
  36.         super();  
  37.         // TODO Auto-generated constructor stub  
  38.     }  
  39.       
  40.       
  41. }  

四、写一个Pul的服务类


  1. package com.example.lession04_pull.service;  
  2. import java.io.File;  
  3. import java.io.FileOutputStream;  
  4. import java.io.InputStream;  
  5. import java.util.ArrayList;  
  6. import java.util.List;  
  7. import org.xmlpull.v1.XmlPullParser;  
  8. import org.xmlpull.v1.XmlSerializer;  
  9. import android.os.Environment;  
  10. import android.util.Xml;  
  11.   
  12. import com.example.lession04_pull.domain.Person;  
  13.   
  14. public class PullXmlService {  
  15.       
  16.     public Person currentPerson;  
  17.   
  18.     public List<Person> readXml(InputStream is){  
  19.         //声明返回值  
  20.         List<Person> persons=null;  
  21.         //首先利用Xml.newPullParser()获取解析对象  
  22.         XmlPullParser xmlPullParser=Xml.newPullParser();  
  23.         try{  
  24.             // 解析文件  
  25.             xmlPullParser.setInput(is, "UTF-8");  
  26.             //获取解析的事件类型  
  27.             int eventType=xmlPullParser.getEventType();  
  28.             //判断文件解析的是否完毕  
  29.             while(eventType!=XmlPullParser.END_DOCUMENT){  
  30.                 switch (eventType) {  
  31.                 case XmlPullParser.START_DOCUMENT:  
  32.                     persons=new ArrayList<Person>();  
  33.                     break;  
  34.   
  35.                 case XmlPullParser.START_TAG:  
  36.                     String tagName=xmlPullParser.getName();  
  37.                     if("person".equals(tagName)){  
  38.                         //创建person对象  
  39.                         currentPerson=new Person();  
  40.                         currentPerson.setId(Integer.parseInt(xmlPullParser  
  41.                                 .getAttributeValue(null"id")));  
  42.                     }else if("name".equals(tagName)){  
  43.                         currentPerson.setName(xmlPullParser.nextText());  
  44.                     }else if("age".equals(tagName)){  
  45.                         currentPerson.setAge(new Short(xmlPullParser.nextText()));  
  46.                     }  
  47.                     break;  
  48.                 case XmlPullParser.END_TAG:  
  49.                     if("person".equals(xmlPullParser.getName()) && currentPerson!=null){  
  50.                         //把person对象放到集合中去  
  51.                         persons.add(currentPerson);  
  52.                         currentPerson=null;  
  53.                     }  
  54.                     break;  
  55.                 }  
  56.                 eventType=xmlPullParser.next();  
  57.             }  
  58.             is.close();  
  59.         }catch(Exception e){  
  60.             e.printStackTrace();  
  61.         }  
  62.         return persons;  
  63.     }  
  64.       
  65.       
  66.       
  67.     // 写入  
  68.         public boolean write(List<Person> persons) {  
  69.             // 采用pull解析进行实现  
  70.   
  71.             if (Environment.getExternalStorageState().equals(  
  72.                     Environment.MEDIA_MOUNTED)) {  
  73.   
  74.                 // 获取sdcard目录 文件对象  
  75.                 File sdCardDir = Environment.getExternalStorageDirectory();  
  76.                 // 创建文件  
  77.                 File file = new File(sdCardDir, "mycsdn.xml");  
  78.   
  79.                 XmlSerializer serializer = Xml.newSerializer();  
  80.   
  81.                 FileOutputStream fos = null;  
  82.                 try {  
  83.                     // 根据文件对象创建一个文件的输出流对象  
  84.                     fos = new FileOutputStream(file);  
  85.                     // 设置输出的流及编码  
  86.                     serializer.setOutput(fos, "UTF-8");  
  87.                     // 设置文件的开始  
  88.                     serializer.startDocument("UTF-8"true);  
  89.                     // persons标签开始  
  90.                     serializer.startTag(null"persons");  
  91.                     for (Person person : persons) {  
  92.                         // person标签的开始  
  93.                         serializer.startTag(null"person");  
  94.                         // 设置person标签的属性  
  95.                         serializer.attribute("null""id", person.getId() + "");  
  96.   
  97.                         // 设置person标签的子标签 name  
  98.                         serializer.startTag(null"name");  
  99.                         serializer.text(person.getName());  
  100.                         serializer.endTag(null"name");  
  101.   
  102.                         // 设置person标签的子标签的age  
  103.                         serializer.startTag(null"age");  
  104.                         serializer.text(person.getAge() + "");  
  105.                         serializer.endTag(null"age");  
  106.   
  107.                         // person标签的结束  
  108.                         serializer.endTag(null"person");  
  109.                     }  
  110.   
  111.                     // persons标签的结束  
  112.                     serializer.endTag(null"persons");  
  113.                     // 文件的结束  
  114.                     serializer.endDocument();  
  115.   
  116.                     fos.flush();  
  117.                     fos.close();  
  118.                     return true;  
  119.                 } catch (Exception e) {  
  120.                     e.printStackTrace();  
  121.                 }  
  122.   
  123.             }  
  124.   
  125.             return false;  
  126.         }  
  127.   
  128. }  


五、在MainActivity中调用测试

  1. package com.example.lession04_pull;  
  2.   
  3. import java.util.List;  
  4.   
  5. import com.example.lession04_pull.domain.Person;  
  6. import com.example.lession04_pull.service.PullXmlService;  
  7.   
  8. import android.os.Bundle;  
  9. import android.app.Activity;  
  10. import android.view.Menu;  
  11. import android.view.View;  
  12. import android.widget.Button;  
  13. import android.widget.Toast;  
  14.   
  15. public class MainActivity extends Activity {  
  16.   
  17.     public Button btn_pull,btn_write;  
  18.     public PullXmlService pullXmlService;  
  19.     @Override  
  20.     protected void onCreate(Bundle savedInstanceState) {  
  21.         super.onCreate(savedInstanceState);  
  22.         setContentView(R.layout.activity_main);  
  23.         //实例化  
  24.         pullXmlService=new PullXmlService();  
  25.           
  26.         btn_pull=(Button) findViewById(R.id.btn_pull);  
  27.         btn_write=(Button) findViewById(R.id.btn_write);  
  28.           
  29.         btn_pull.setOnClickListener(new MyOnClickListener());  
  30.         btn_write.setOnClickListener(new MyOnClickListener());  
  31.     }  
  32.   
  33.     @Override  
  34.     public boolean onCreateOptionsMenu(Menu menu) {  
  35.         // Inflate the menu; this adds items to the action bar if it is present.  
  36.         getMenuInflater().inflate(R.menu.main, menu);  
  37.         return true;  
  38.     }  
  39.       
  40.     class MyOnClickListener implements View.OnClickListener{  
  41.   
  42.         @Override  
  43.         public void onClick(View v) {  
  44.             int id=v.getId();  
  45.             switch (id) {  
  46.             case R.id.btn_pull:  
  47.                 List<Person> persons=null;  
  48.                 try{  
  49.                     persons=pullXmlService.readXml(getAssets().open("csdn.xml"));  
  50.                 }catch(Exception e){  
  51.                     e.printStackTrace();  
  52.                 }  
  53.                 if(persons!=null){  
  54.                     Toast.makeText(MainActivity.this"采用pull解析xml文件"+persons.get(0).getName()+"--"+persons.get(1).getName(),  
  55.                             Toast.LENGTH_LONG).show();  
  56.                 }  
  57.                 break;  
  58.   
  59.             case R.id.btn_write:  
  60.                 try{  
  61.                     List<Person> pers=pullXmlService.readXml(getAssets().open("csdn.xml"));  
  62.                     //重新生成一个xml文件  mysdcare.xml  
  63.                     boolean flag=pullXmlService.write(pers);  
  64.                     if(flag){  
  65.                         Toast.makeText(MainActivity.this"采用pull解析生产xml文件成功",  
  66.                                 Toast.LENGTH_LONG).show();  
  67.                     }else{  
  68.                         Toast.makeText(MainActivity.this"采用pull解析生产xml文件失败",  
  69.                                 Toast.LENGTH_LONG).show();  
  70.                           
  71.                     }  
  72.                 }catch(Exception e){  
  73.                     e.printStackTrace();  
  74.                 }  
  75.                 break;  
  76.             }  
  77.               
  78.         }  
  79.           
  80.     }  
  81.   
  82. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值