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

时间:2021-04-23 06:45:53

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

一、布局界面

  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. <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>

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

二、写一个xml文件

  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. }

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

五、在MainActivity中调用测试

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

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