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

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);

    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://my.oschina.net/u/2411130/blog/477367

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值