Android使用Pull解析和生成XML文件

Android使用Pull解析和生成XML文件

除了可以使用SAX和DOM解析XML文件之外,还可以使用Android内置的pull解析器解析xml文件。采用事件驱动,返回相应的数值代码。

一、首先是Pull解析xml文件
1. 以解析该xml文件为例:
<?xml version="1.0" encoding="UTF-8"?>
<persons>
    <person id="23">
        <name>大明</name>
        <age>30</age>
    </person>
    <person id="20">
        <name>小明</name>
        <age>25</age>
    </person>
</persons>
2.新建JavaBean,用于存放xml文件中的person数据:
public class Person {

    private int id;
    private String name;
    private short age;

    public Person() {
        super();
    }
    public Person(int id, String name, short age) {
        super();
        this.id = id;
        this.name = name;
        this.age = age;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public short getAge() {
        return age;
    }
    public void setAge(short age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
    }

}
3.新建业务操作类:
public class PULLPersonService {

    public static List<Person> getPersons(InputStream inputStream) throws Exception {
        List<Person> persons = null;
        Person person = null;
        XmlPullParser parser = Xml.newPullParser();
        parser.setInput(inputStream, "UTF-8");
        int eventType = parser.getEventType(); //返回第一个事件数值代码

        while(eventType != XmlPullParser.END_DOCUMENT) {
            switch(eventType) {
            case XmlPullParser.START_DOCUMENT:
                persons = new ArrayList<Person>();
                break;
            case XmlPullParser.START_TAG:
                String name = parser.getName();
                if("person".equals(name)) {
                    person = new Person();
                    person.setId(new Integer(parser.getAttributeValue(0)));
                }
                if(person != null) {
                    if("name".equals(name)) {
                        person.setName(parser.nextText());
                    } else if("age".equals(name)) {
                        person.setAge(new Short(parser.nextText()));
                    }
                }
                break;
            case XmlPullParser.END_TAG:
                if("person".equals(parser.getName())) {
                    persons.add(person);
                    person = null;
                }
                break;
            default:
                break;
            }
            eventType = parser.next();
        }
        return persons;
    }

}
4.新建单元测试类:
public class PersonServiceTest extends AndroidTestCase {

    public void testPULLGetPersons() throws Exception {
        InputStream inputStream = getClass().getClassLoader().getResourceAsStream("test.xml");
        List<Person> persons = PULLPersonService.getPersons(inputStream);
        for(Person person : persons) {
            Log.i("PULL", person.toString());
        }
    }

}
二、其次是Pull生成xml文件
1. 使用OutputStream生成xml文件:
public static void save(List<Person> persons, OutputStream outputStream) throws Exception {
        XmlSerializer serializer = Xml.newSerializer();
        serializer.setOutput(outputStream, "UTF-8");
        serializer.startDocument("UTF-8", true);
        serializer.startTag(null, "persons");
        for(Person person : persons) {
            serializer.startTag(null, "person");
            serializer.attribute(null, "id", String.valueOf(person.getId()));
            serializer.startTag(null, "name");
            serializer.text(person.getName());
            serializer.endTag(null, "name");
            serializer.startTag(null, "age");
            serializer.text(String.valueOf(person.getAge()));
            serializer.endTag(null, "age");
            serializer.endTag(null, "person");
        }
        serializer.endTag(null, "persons");
        serializer.endDocument();
        outputStream.flush();
        outputStream.close();
    }
2.新建单元测试方法:
public void testSave() throws Exception {
        List<Person> persons = new ArrayList<Person>();
        persons.add(new Person(001, "haha", (short)12));
        persons.add(new Person(002, "你好", (short)23));
        persons.add(new Person(003, "欧巴", (short)34));
        File file = new File(this.getContext().getFilesDir(), "person.xml");
        FileOutputStream outputStream = new FileOutputStream(file);
        PULLPersonService.save(persons, outputStream);
    }
3. 使用Writer生成xml文件:
public static void save(List<Person> persons, Writer writer) throws Exception {
        XmlSerializer serializer = Xml.newSerializer();
        serializer.setOutput(writer);
        serializer.startDocument("UTF-8", true);
        serializer.startTag(null, "persons");
        for(Person person : persons) {
            serializer.startTag(null, "person");
            serializer.attribute(null, "id", String.valueOf(person.getId()));
            serializer.startTag(null, "name");
            serializer.text(person.getName());
            serializer.endTag(null, "name");
            serializer.startTag(null, "age");
            serializer.text(String.valueOf(person.getAge()));
            serializer.endTag(null, "age");
            serializer.endTag(null, "person");
        }
        serializer.endTag(null, "persons");
        serializer.endDocument();
        writer.flush();
        writer.close();
    }
4.新建单元测试方法:
public void testSave() throws Exception {
        List<Person> persons = new ArrayList<Person>();
        persons.add(new Person(001, "haha", (short)12));
        persons.add(new Person(002, "你好", (short)23));
        persons.add(new Person(003, "欧巴", (short)34));
        File file = new File(this.getContext().getFilesDir(), "ppp.xml");
        FileOutputStream outputStream = new FileOutputStream(file);
        OutputStreamWriter writer = new OutputStreamWriter(outputStream, "UTF-8");
        BufferedWriter bwriter = new BufferedWriter(writer);//缓存
        PULLPersonService.save(persons, bwriter);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值