Android采用操作xml

在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     @Override
39     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();  //初始化xmlpullparse
11         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的字段值,即id
29                     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文件来存取数据。

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

posted @ 2012-08-21 17:23  非著名程序师  阅读(1567)  评论(0编辑  收藏  举报