Android:采用SAX解析XML实例

接着之前的部分现在要编写代码解析如下的person.xml文件

<?xml version="1.0" encoding="utf-8"?>
<persons>
    <person id="23">
        <name>liming</name>
        <age>30</age>
    </person>
    <person id="20">
        <name>xiaohong</name>
        <age>25</age>
    </person>
</persons>

程序结构图如下
这里写图片描述
person类用于保存信息
SAXPersonService负责解析

package wade.domain;
public class Person {
    private Integer id;
    private String name;
    private Short 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 Short getAge() {
        return age;
    }
    public void setAge(Short age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
    }
}
public class SAXPersonService {
    public List<Person> getPersons(InputStream inputStream) throws Throwable
    {
        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser parser =factory.newSAXParser();
        PersonParser personparse = new PersonParser();
        //void parse(InputStream is, DefaultHandler dh) 
        //throws SAXException, IOException
        parser.parse(inputStream, personparse);
        inputStream.close();
        return personparse.getPersons();    
    }
    //内部类重写了回调函数
    private class PersonParser extends DefaultHandler{
        private List<Person> persons=null;
        private Person person=null;
        private String tag=null;//用于存储读到的元素节点

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

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

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

        @Override
        public void startElement(String uri, String localName, String qName,
                Attributes attributes) throws SAXException {
            //假设<s:person id="20">,则
            //uri="s",
            //localName="person",
            //qName="s:person" 
            //attributes得到所有的属性名和属性值
            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;
        }   
    }
}

使用junit进行测试

public class SAXPersonServiceTest extends AndroidTestCase{
    private static final String TAG = "SAXPersonServiceTest";
    public void testGetPersons() throws Throwable{
        SAXPersonService service = new SAXPersonService();
        InputStream inStream = getClass().getClassLoader().getResourceAsStream("person.xml");
        List<Person> persons=service.getPersons(inStream);
        for(Person p:persons){
            Log.i(TAG, p.toString());
        }
    }
}

结果
这里写图片描述

说明正确解析了xml文件。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值