Android:采用SAX解析XML实例

来源:互联网 发布:nginx 集群配置 编辑:程序博客网 时间:2024/06/01 19:46

接着之前的部分现在要编写代码解析如下的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