2.1xml解析和序列化

1、创建一个实体类,人的属性getter and setter方法
2、在一个list列表中添加30个人的信息

第一种解析是序列化XmlSerializer直接写xml文件到本地
/**
* XmlSerializer写xml文件到本地
* 获得序列化对象
* 读取到xml的开始 startDocument
* 读取到xml的结束 endDocument
* 读取到xml的开始标签返回 startTag
* 读取到xml的结束标签返回 endTag
*/
第二种解析是pull解析器对象
/**
* 获得pull解析器对象
* 读取到xml的结束返回 END_DOCUMENT
* 读取到xml的开始标签返回 START_TAG
* 读取到xml的结束标签返回 END_TAG
* @return
*/

person实体类

package com.zhansy.xmldemo;

/**
 * Created by ZHANSY on 2015/8/14.
 */
public class Person {
    //个人信息,ID 姓名 年龄
    private int id;
    private String name;
    private int age;

    public Person(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public Person() {
    }

    public int getId() {
        return id;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
package com.zhansy.xmldemo;

import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Xml;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlSerializer;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    /**
     * XmlSerializer写xml文件到本地
     * 获得序列化对象
     * 读取到xml的开始 startDocument
     * 读取到xml的结束 endDocument
     * 读取到xml的开始标签返回 startTag
     * 读取到xml的结束标签返回 endTag
     */
    private void writeXmlToLocal() {
        //获得有多少个人的列表
        List<Person> personList = getPersonList();
        // 获得序列化对象
        XmlSerializer serializer = Xml.newSerializer();

        try {
            //获得内存卡的路径,创建persons.xml文件
            File path = new File(Environment.getExternalStorageDirectory(), "persons.xml");
            FileOutputStream fos = new FileOutputStream(path);
            // 指定序列化对象输出的位置和编码
            serializer.setOutput(fos, "utf-8");
            //开始文档,起始(编码,是否独立),后面也要结束文档,相呼应
            serializer.startDocument("utf-8", true);    // 写开始 <?xml version='1.0' encoding='utf-8' standalone='yes' ?>
            //开始Tag标签
            serializer.startTag(null, "persons");        // <persons>

            for (Person person : personList) {
                // 开始写人
                serializer.startTag(null, "Person");    // <Person>
                //写人的属性
                serializer.attribute(null, "id", String.valueOf(person.getId()));
                // 写名字
                serializer.startTag(null, "name");        // <name>
                serializer.text(person.getName());
                serializer.endTag(null, "name");        // </name>
                // 写年龄
                serializer.startTag(null, "age");        // <age>
                serializer.text(String.valueOf(person.getAge()));
                serializer.endTag(null, "age");        // </age>
                serializer.endTag(null, "Person");    // </Person>
            }
            serializer.endTag(null, "persons");       // </persons>
            serializer.endDocument();        // 结束
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /**
     *
     * 添加多个人,放在List中
     * @return 人的列表
     */
    private List<Person> getPersonList() {
        List<Person> personList = new ArrayList<Person>();

        for (int i = 0; i < 30; i++) {
            personList.add(new Person(i, "wang" + i, 18 + i));
        }

        return personList;
    }

    /**
     * 获得pull解析器对象
     * 读取到xml的结束返回 END_DOCUMENT
     * 读取到xml的开始标签返回 START_TAG
     * 读取到xml的结束标签返回 END_TAG
     * @return
     */
    private List<Person> parserXmlFromLocal() {
        try {
            //同样需要找到他的路径
            File path = new File(Environment.getExternalStorageDirectory(), "persons.xml");
            FileInputStream fis = new FileInputStream(path);

            // 获得pull解析器对象
            XmlPullParser parser = Xml.newPullParser();
            // 指定解析的文件和编码格式
            parser.setInput(fis, "utf-8");

            int eventType = parser.getEventType();     // 获得事件类型

            List<Person> personList = null;
            Person person = null;
            String id;
            while (eventType != XmlPullParser.END_DOCUMENT) {
                String tagName = parser.getName();    // 获得当前节点的名称

                switch (eventType) {
                    case XmlPullParser.START_TAG:        // 当前等于开始节点  <Person>
                        if ("persons".equals(tagName)) {    // <persons>
                            personList = new ArrayList<Person>();
                        } else if ("Person".equals(tagName)) { // <Person id="1">
                            person = new Person();
                            //设置id属性
                            id = parser.getAttributeValue(null, "id");
                            //设置person的id的值
                            person.setId(Integer.valueOf(id));
                        } else if ("name".equals(tagName)) { // <name>
                            person.setName(parser.nextText());//nextText获得文本内容
                        } else if ("age".equals(tagName)) { // <age>
                            person.setAge(Integer.parseInt(parser.nextText()));
                        }
                        break;
                    case XmlPullParser.END_TAG:        // </persons>
                        if ("Person".equals(tagName)) {
                            // 需要把上面设置好值的person对象添加到集合中
                            personList.add(person);
                        }
                        break;
                    default:
                        break;
                }

                eventType = parser.next();        // 获得下一个事件类型
            }
            return personList;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值