Android学习--使用Pull解析器读取XML文件、将对象写入XML文件

居然没有保存上,今天补上。。。



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

一、布局界面

[html]  view plain copy
  1. <RelativeLayoutxmlns: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. <Button
  11. android:id="@+id/btn_pull"
  12. android:layout_width="wrap_content"
  13. android:layout_height="wrap_content"
  14. android:layout_alignParentLeft="true"
  15. android:layout_alignParentRight="true"
  16. android:layout_alignParentTop="true"
  17. android:layout_marginTop="110dp"
  18. android:text="@string/btn_pull"/>
  19. <Button
  20. android:id="@+id/btn_write"
  21. android:layout_width="wrap_content"
  22. android:layout_height="wrap_content"
  23. android:layout_alignLeft="@+id/btn_pull"
  24. android:layout_alignRight="@+id/btn_pull"
  25. android:layout_below="@+id/btn_pull"
  26. android:layout_marginTop="61dp"
  27. android:text="@string/btn_write"/>
  28. </RelativeLayout>
[html]  view plain copy
  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>  


Android学习--使用Pull解析器读取XML文件、将对象写入XML文件_第1张图片

二、写一个xml文件

[java]  view plain copy
  1. <span style="color:#000000;">[html] view plaincopyprint?  
  2. <?xml version="1.0" encoding="UTF-8"?>   
  3. <persons>   
  4. <person id="23">   
  5. <name>李明</name>   
  6. <age>30</age>   
  7. </person>   
  8. <person id="20">   
  9. <name>李向梅</name>   
  10. <age>25</age>   
  11. </person>   
  12. </persons> </span>  

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

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


 

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

你可能感兴趣的:(Android学习--使用Pull解析器读取XML文件、将对象写入XML文件)