Android 使用SAX解析XML文件

Android 使用SAX解析XML文件

SAX, Simple API for XML,采用事件驱动。当读取到相应内容时便会调用相应的回调函数(方法),这些方法定义在ContentHandler接口中。

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 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 SAXPersonService {

    public List<Person> getPersons(InputStream inputStream) throws Exception {

        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser parser = factory.newSAXParser();
        PersonParserHandler handler = new PersonParserHandler();
        parser.parse(inputStream, handler);
        inputStream.close();
        return handler.getPersons();
    }

    private final class PersonParserHandler extends DefaultHandler {

        private List<Person> persons = null;
        private Person person;
        private String tag = null;


        public List<Person> getPersons() {
            return persons;
        }

        @Override
        public void startDocument() throws SAXException {
            persons = new ArrayList<Person>();
        }

        @Override
        public void startElement(String uri, String localName, String qName,
                Attributes attributes) throws SAXException {
            if("person".equals(localName)) {
                person = new Person();
                person.setId(new Integer(attributes.getValue(0)));
            }
            tag = localName;
        } 

        @Override
        public void endElement(String uri, String localName, String qName)
                throws SAXException {
            if("person".equals(localName)) {
                persons.add(person);
                person = null;
            }
            tag = null;
        }

        @Override
        public void characters(char[] ch, int start, int length)
                throws SAXException {
            if(tag != null) {
                if("name".equals(tag)) {
                    person.setName(new String(ch, 0, length));//获取name中文本节点数据
                }else if("age".equals(tag)) {
                    person.setAge(new Short(new String(ch, 0, length)));//获取age中文本节点数据
                }
            }
        }

    }

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

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

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值