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

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

  • 相关阅读:
    浅谈MyBatis-Plus学习之条件构造器 EntityWrapper
    浅谈MyBatis-Plus学习之插件扩展
    [XSS防御]HttpOnly之四两拨千斤
    [PHP防火墙]输入内容存在危险字符,安全起见,已被本站拦截
    [思路笔记]WEB安全之漏洞挖掘
    通过TleChat插件一键Getshell
    云服务器上安装MSF环境
    (vshadow)Volume Shadow在渗透测试中的利用
    一个帖子csrf的例子
    yuyuecms 1.2文件删除漏洞
  • 原文地址:https://www.cnblogs.com/fanchangfa/p/2649372.html
Copyright © 2020-2023  润新知