首页 > 代码库 > 使用Pull解析器生成XML文件和读取xml文件

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

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

一、布局界面

[html] view plaincopyprint?
 
  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] view plaincopyprint?
 
  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

[java] view plaincopyprint?
 
  1. package com.example.lession04_pull.domain;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. public class Person implements Serializable{  
  6.   
  7.     /** 
  8.      *  
  9.      */  
  10.     private static final long serialVersionUID = 1L;  
  11.     private int id;  
  12.     private String name;  
  13.     private short age;  
  14.     public int getId() {  
  15.         return id;  
  16.     }  
  17.     public void setId(int id) {  
  18.         this.id = id;  
  19.     }  
  20.     public String getName() {  
  21.         return name;  
  22.     }  
  23.     public void setName(String name) {  
  24.         this.name = name;  
  25.     }  
  26.     public short getAge() {  
  27.         return age;  
  28.     }  
  29.     public void setAge(short age) {  
  30.         this.age = age;  
  31.     }  
  32.     public Person(int id, String name, short age) {  
  33.         super();  
  34.         this.id = id;  
  35.         this.name = name;  
  36.         this.age = age;  
  37.     }  
  38.     public Person() {  
  39.         super();  
  40.         // TODO Auto-generated constructor stub  
  41.     }  
  42.       
  43.       
  44. }  


四、写一个Pul的服务类

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


五、在MainActivity中调用测试

[java] view plaincopyprint?
 
    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. }  

 

 

http://blog.csdn.net/xueshuangshuang123/article/details/9016161