Android采用操作xml
16lz
2021-01-23
在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文件来存取数据。
以上为个人理解,如有不正确地方希望多多反馈,相互学习,共同进步。
更多相关文章
- IDA动态调试Android的DEX文件
- android反编译apk文件
- android工程下的文件资源类型
- linux内核启动android文件系统过程分析
- Android 从properties配置文件读取数据
- 10天学通Android开发(7)-数据存储
- Android SAX和DOM解析XML文件