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