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文件来存取数据。

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

你可能感兴趣的:(android)