在Android中很多可以将xml作为配置文件将一些信息写入到xml文件中然后读取。

Android提供了Pull解析器XmlPullParser和XmlSerializer用来读取和写入xml文件。下面将介绍如何使用对xml文件进行操作:

首先建立我们自定义数据的集合类:

 1 public class Student { 2     private Integer id; 3     private String name; 4     private Integer age; 5      6     public Student(Integer id , String name ,Integer age){ 7         this.id = id; 8         this.name = name; 9         this.age = age;10     }11     12     public Student(){}13     14     public Integer getId() {15         return id;16     }17     18     public void setId(Integer id) {19         this.id = id;20     }21     22     public String getName() {23         return name;24     }25     26     public void setName(String name) {27         this.name = name;28     }29     30     public Integer getAge() {31         return age;32     }33     34     public void setAge(Integer age) {35         this.age = age;36     }37 38     @Override39     public String toString() {40         return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";41     }42     43     44 }

我们读取的数据集合为List<Student>

假设我们读取的xml文件为:

  

 1 <?xml version="1.0" encoding="UTF-8"?> 2 <students> 3     <student id="23"> 4         <name>fanchangfa</name> 5         <age>21</age> 6     </student> 7     <student id="20"> 8         <name>zhangsan</name> 9         <age>25</age>10     </student>11 </students>

读取xml文件需要用到XmlPullParser:

 1 /** 2      * 获取xml文件数据 3      * @return 4      */ 5     public static List<Student> getStudent(InputStream xml) throws Exception{ 6         Student student = null; 7          8         List<Student> students= null; 9         10         XmlPullParser xmlpull = Xml.newPullParser();  //初始化xmlpullparse11         xmlpull.setInput(xml, "UTF-8");          //设置读取xml文件的编码格式12         13         int event = xmlpull.getEventType();        //获取xml文件内容的事件类型,实际上它是逐行读取文件的,即先从<?xml..从开始读取14         15         while(event != XmlPullParser.END_DOCUMENT)16         {17             switch(event)18             {19             case XmlPullParser.START_DOCUMENT:      //当文档开始<?xml..20                 students = new ArrayList<Student>();21                 break;22                 23             case XmlPullParser.START_TAG:          //每个标签的开始定义处24                 if("student".equals(xmlpull.getName()))25                 {26                     student = new Student();27                     //int id = new Integer(xmlpull.getAttributeName(0));28                     int id = new Integer(xmlpull.getAttributeValue(0));  //通过getAttributeValue来获得索引为0的字段值,即id29                     student.setId(id);30                 }31                 32                 if("name".equals(xmlpull.getName()))33                 {34                     String name = xmlpull.nextText();    //直接获得中间值nextText()35                     student.setName(name);36                 }37                 38                 if("age".equals(xmlpull.getName()))39                 {40                     int age = new Integer(xmlpull.nextText());41                     student.setAge(age);42                 }43                 44                 break;45                 46             case XmlPullParser.END_TAG:47                 if("student".equals(xmlpull.getName()))  //当一条记录结束后添加到集合中48                 {49                     students.add(student);50                     student = null;51                 }52                 break;53             }54             55             event = xmlpull.next();      //根据xml文件结果一次向下遍历56         }57         58         return students;59}

这样我们便可以得到students中的结果集。

下面我们看一下如何写入xml文件,其实写入文件和我们日常习惯一样,即先定义开始,然后标签、值、结束。。。

写入xml需要用到XmlSerializer:

加入再次我们传入一个List<Student>然后需要将其中的数据写入到一个新的xml文件中:

  

 1     /** 2      * 保存内容到xml文件中 3      * @param xml 4      * @throws Exception 5      */ 6     public static void save(List<Student> students,OutputStream xml) throws Exception{ 7         XmlSerializer xmlser =Xml.newSerializer();        //初始化一个XmlSerializer对象 8         xmlser.setOutput(xml, "UTF-8");                    //定义编码格式为UTF-8 9         10         xmlser.startDocument("UTF-8", true);            //开始文档,第二个参数为是否独立11         12         xmlser.startTag(null, "students");                //设置一个标签13         14         for(Student stu : students)                        //从传入集合中开始循环写入到xml文件中15         {16             xmlser.startTag(null, "student");17             xmlser.attribute(null, "id", stu.getId().toString());        //设置标签的id值18             19             xmlser.startTag(null, "name");        20             xmlser.text(stu.getName());                    //设置标签中间的text值21             xmlser.endTag(null, "name");22             23             xmlser.startTag(null, "age");24             xmlser.text(stu.getAge().toString());25             xmlser.endTag(null, "age");26             27             xmlser.endTag(null, "student");28         }29         30         xmlser.endTag(null, "students");31         32         xmlser.endDocument();                            //结束文档标签33     }

经过测试,即可生成一个新的文件,其中第二个参数为要生成的xml的文件输出流。

下面我们可以测试操作是否正确:

读取文件:

1 Log.i(TAG, "test");2         InputStream xml = this.getClass().getClassLoader().getResourceAsStream("test.xml");3         List<Student> students = XmlOperate.getStudent(xml);4         5         for(Student stu : students){6             Log.i(TAG, stu.toString());7         }

在控制台log中即可看到我们输出的数据。

写入文件:

 1 public void TestSave()throws Exception{ 2         List<Student> students = new ArrayList<Student>(); 3         students.add(new Student(1,"fanchangfa",20)); 4         students.add(new Student(2,"xiangjiuyi",21)); 5         students.add(new Student(3,"wangjiguang",22)); 6         students.add(new Student(4,"liulei",23)); 7         students.add(new Student(5,"liuzihang",25)); 8          9         File xmlfile = new File(getContext().getFilesDir(),"test.xml");    //我们将test.xml文件放在src根目录下10         11         FileOutputStream xml = new FileOutputStream(xmlfile);12         13         XmlOperate.save(students, xml);14     }

最后我们可以在src根目录中得到test1.xml:

用Eclipse Format以后显示为:

<?xml version='1.0' encoding='UTF-8' standalone='yes'?><students>    <student id="1" >        <name>fanchangfa        </name>        <age>20        </age>    </student>    <student id="2" >        <name>xiangjiuyi        </name>        <age>21        </age>    </student>    <student id="3" >        <name>wangjiguang        </name>        <age>22        </age>    </student>    <student id="4" >        <name>liulei        </name>        <age>23        </age>    </student>    <student id="5" >        <name>liuzihang        </name>        <age>25        </age>    </student></students>

在Android中很多时候内部也是采用xml来存取数据,如sharedPreferences也是通过xml文件来存取数据。

以上为个人理解,如有不正确地方希望多多反馈,相互学习,共同进步。

更多相关文章

  1. IDA动态调试Android的DEX文件
  2. android反编译apk文件
  3. android工程下的文件资源类型
  4. linux内核启动android文件系统过程分析
  5. Android 从properties配置文件读取数据
  6. 10天学通Android开发(7)-数据存储
  7. Android SAX和DOM解析XML文件

随机推荐

  1. Android:使用SAX或者DOM或者pull操作XML文
  2. ReactNative全面屏(Android)适配问题
  3. android国际化(多语言)
  4. Android默认闹钟-铃声-通知提示音修改
  5. android:clipToPadding的使用详解
  6. android:AssetManager
  7. 【转】android AsyncTask 为 多任务 多线
  8. MVP 模式在 Android(安卓)中的使用
  9. Android Context原理分析
  10. 查看android里的数据库的内容的方法