标签: xmlsax解析器解析
2014-06-02 22:42 1286人阅读 收藏 举报
XML是一种常见的数据传输方式,所以在开发中,我们会遇到对XML文件进行解析的时候,本篇主要介绍使用SAM解析器,对XML文件进行解析。
SAX解析器的优点是显而易见的,那就是SAX并不需要将所有的文档都加载内存之后才进行解析,SAX是事件驱动机制的,也就是碰到元素节点、文本节点、文档节点的时候,都会触发一定的事件,我们只需要在相应的回调事件里面进行相应的处理就可以了。因为这个特点,所以SAX解析占用的内存比较少,其他的解析方式,比如下一节要介绍的DOM解析器,则占用内存比较多。在解析比较小的XML文件的时候,区别不是很大,大家哪种顺手就可以用哪种。但是当需要解析的文档达到几百K以上的时候,还是推荐使用SAX解析器或者是PULL解析器。这几种XML的解析方式,我都会在以后的文章中进行介绍,今天重点看SAX解析器。
下面是我们要进行解析的文件格式
- <?xml version="1.0" encoding="UTF-8"?>
- <persons>
- <person id="23">
- <name>liming</name>
- <age>30</age>
- </person>
- <person id="20">
- <name>lixiangmei</name>
- <age>25</age>
- </person>
- </persons>
下面是我们的实体类
- public class Person {
- private Integer id;
- private String name;
- private Short age;
-
- public Person(){}
-
- public Person(Integer id, String name, Short age) {
- this.id = id;
- this.name = name;
- this.age = 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 [age=" + age + ", id=" + id + ", name=" + name + "]";
- }
-
- }
我们定义一个SAM解析器,对内容进行解析
-
-
-
-
-
-
- public class SaxResolve {
-
- public List<Person> getPersons(InputStream inputStream) throws Exception {
-
-
- SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
-
- PersonHandler handler = new PersonHandler();
-
- parser.parse(inputStream, handler);
-
- inputStream.close();
-
- return handler.getPersons();
- }
-
- private class PersonHandler extends DefaultHandler {
-
- private List<Person> persons;
- private Person person = null;
- 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 (localName.equals("person")) {
- person = new Person();
- person.setId(new Integer(attributes.getValue(0)));
- }
- tag = localName;
- }
-
-
-
- @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.setAge(new Short(data));
- }
- }
-
- }
-
-
-
-
-
-
-
-
-
-
- @Override
- public void endElement(String uri, String localName, String qName)
- throws SAXException {
- if (localName.equals("person")) {
- persons.add(person);
- person = null;
- }
- tag = null;
- }
-
- }
-
- }
因为注释比较详细,所以不过多解析,下面我们使用单元测试,对解析进行测试
-
- public void testSax() throws Exception {
-
- InputStream inputStream = getClass().getClassLoader()
- .getResourceAsStream("persons.xml");
-
- List<Person> persons = new SaxResolve().getPersons(inputStream);
-
- for (Person p : persons) {
- Log.d(TAG, p.toString());
- }
-
- }
下面是解析结果