采用Pull解析器解析和生成XML内容

来源:互联网 发布:thinksns app源码 编辑:程序博客网 时间:2024/05/16 07:25

Pull解析器是一个开源的java项目,既可以用于android,也可以用于JavaEE。如果用在javaEE需要把其jar文件放入类路径中,因为Android已经集成进了Pull解析器,所以无需添加任何jar文件。android系统本身使用到的各种xml文件,其内部也是采用Pull解析器进行解析的。Pull解析器的运行方式与 SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。跟SAX不同的是,Pull解析器产生的事件是一个数字,而非方法,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值。

1.工程目录结构
这里写图片描述

person.xml

<?xml version="1.0" encoding="UTF-8"?><persons>    <person id="23">        <name>leehom</name>        <age>38</age>    </person>    <person id="20">        <name>leoleo</name>        <age>22</age>    </person></persons>

2.1 person.java

package com.example.domain;public class Person {    private Integer id;    private String name;    private Integer age;    public Integer getId() {        return id;    }    public void setId(Integer id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Integer getAge() {        return age;    }    public void setAge(Integer age) {        this.age = age;    }    @Override    public String toString() {        return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";    }    public Person(Integer id, String name, Integer age) {        super();        this.id = id;        this.name = name;        this.age = age;    }    public Person() {        super();        // TODO Auto-generated constructor stub    }}

2.2 PersonService.java

package com.example.service;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.ArrayList;import java.util.List;import org.xmlpull.v1.XmlPullParser;import org.xmlpull.v1.XmlSerializer;import android.util.Xml;import com.example.domain.Person;public class PersonService {    /**     * 获取数据     *      * @param xml     * @return     * @throws Exception     */    public static List<Person> getPersons(InputStream xml) throws Exception {        List<Person> persons = null;        Person person = null;        XmlPullParser pullParser = Xml.newPullParser();        pullParser.setInput(xml, "utf-8");// 为pull解析器设置要解析的xml数据        int event = pullParser.getEventType();        while (event != XmlPullParser.END_DOCUMENT) {            switch (event) {            case XmlPullParser.START_DOCUMENT:                persons = new ArrayList<Person>();                break;            case XmlPullParser.START_TAG:                if ("person".equals(pullParser.getName())) {                    int id = new Integer(pullParser.getAttributeValue(0));                    person = new Person();                    person.setId(id);                } else if ("name".equals(pullParser.getName())) {                    String name = pullParser.nextText();                    person.setName(name);                } else if ("age".equals(pullParser.getName())) {                    int age = new Integer(pullParser.nextText());                    person.setAge(age);                }                break;            case XmlPullParser.END_TAG:                if ("person".equals(pullParser.getName())) {                    persons.add(person);                    person = null;                }                break;            }            event = pullParser.next();        }        return persons;    }    /**     * 保存数据     *      * @param persons     * @param outStream     * @throws Exception     */    public static void save(List<Person> persons, OutputStream outStream)            throws Exception {        XmlSerializer serializer = Xml.newSerializer(); // 创建xml的序列化文件        serializer.setOutput(outStream, "UTF-8"); // 传入保存的输出流,和字符集编码        serializer.startDocument("UTF-8", true); // xml头标签字符集设置,是否序列化        serializer.startTag(null, "persons"); // 开始节点设置,(命名空间null,名称persons)        for (Person person : persons) { // 循环设置每个节点的属性和数据            serializer.startTag(null, "person");            serializer.attribute(null, "id", person.getId().toString());            serializer.startTag(null, "name");            serializer.text(person.getName());            serializer.endTag(null, "name");            serializer.startTag(null, "age");            serializer.text(person.getAge().toString());            serializer.endTag(null, "age");            serializer.endTag(null, "person");        }        serializer.endTag(null, "persons"); // 设置结束节点        serializer.endDocument(); // 结束xml编辑,即设置xml文档结尾        outStream.flush(); // 最好先将缓存中数据刷出再关闭输出流以防传入的流是缓存流        outStream.close();    }}

2.3 PersonServiceTest.java

package com.example.test;import java.io.File;import java.io.FileOutputStream;import java.io.InputStream;import java.util.ArrayList;import java.util.List;import android.test.AndroidTestCase;import android.util.Log;import com.example.domain.Person;import com.example.service.PersonService;public class PersonServiceTest extends AndroidTestCase {    private static final String TAG="PersonServiceTest";    public void testPersons() throws Exception{        InputStream xml = this.getClass().getClassLoader().getResourceAsStream("person.xml");        List<Person> persons = PersonService.getPersons(xml);        for(Person person :persons){            Log.i(TAG, person.toString());        }    }    public void testSave() throws Exception{        List<Person> persons = new ArrayList<Person>();        persons.add(new Person(1, "leo1", 21));        persons.add(new Person(2, "leo2", 22));        persons.add(new Person(3, "leo3", 23));        //包 /files        File xmlFile = new File(getContext().getFilesDir(), "leoleohan.xml");        FileOutputStream outStream = new FileOutputStream(xmlFile);        PersonService.save(persons, outStream);    }}
3 0
原创粉丝点击