在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文件来存取数据。
以上为个人理解,如有不正确地方希望多多反馈,相互学习,共同进步。