在android中,解析xml有三种方法,SAX ,DOM,还有android自身提供的PULL解析器。

SAX方法介绍

SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备。 SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML语法中的某部分,如果符合就会触发事件。所谓事件,其实就是一些回调(callback)方法,这些方法(事件)定义在ContentHandler接口。下面是一些ContentHandler接口常用的方法:
startDocument()
当遇到文档的开头的时候,调用这个方法,可以在其中做一些预处理的工作。
endDocument()
和上面的方法相对应,当文档结束的时候,调用这个方法,可以在其中做一些善后的工作。
startElement(String namespaceURI, String localName, String qName, Attributes atts)
当读到一个开始标签的时候,会触发这个方法。namespaceURI就是命名空间,localName是不带命名空间前缀的标签名,qName是带命名空间前缀的标签名。通过atts可以得到所有的属性名和相应的值。要注意的是SAX中一个重要的特点就是它的流式处理,当遇到一个标签的时候,它并不会纪录下以前所碰到的标签,也就是说,在startElement()方法中,所有你所知道的信息,就是标签的名字和属性,至于标签的嵌套结构,上层标签的名字,是否有子元属等等其它与结构相关的信息,都是不得而知的,都需要你的程序来完成。这使得SAX在编程处理上没有DOM来得那么方便。
endElement(String uri, String localName, String name)
这个方法和上面的方法相对应,在遇到结束标签的时候,调用这个方法。
characters(char[] ch, int start, int length)
这个方法用来处理在XML文件中读到的内容,第一个参数用于存放文件的内容,后面两个参数是读到的字符串在这个数组中的起始位置和长度,使用new String(ch,start,length)就可以获取内容。

例子:

1.person.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保存这些属性

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;}}
3.
public class PersonContentHandler extends DefaultHandler {private List<Person> persons = null;private Person currentPerson;private String tagName = null;//当前解析的元素标签public List<Person> getPersons() {return persons;}/* * 接收文档的开始的通知。 */@Override public void startDocument() throws SAXException {persons = new ArrayList<Person>();}/* * 接收字符数据的通知。 */@Override public void characters(char[] ch, int start, int length) throws SAXException {if(tagName!=null){String data = new String(ch, start, length);if(tagName.equals("name")){this.currentPerson.setName(data);}else if(tagName.equals("age")){this.currentPerson.setAge(Short.parseShort(data));}}}/* * 接收元素开始的通知。 * 参数意义如下: *    namespaceURI:元素的命名空间 *    localName :元素的本地名称(不带前缀) *    qName :元素的限定名(带前缀) *    atts :元素的属性集合 */@Override public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {if(localName.equals("person")){currentPerson = new Person();currentPerson.setId(Integer.parseInt(atts.getValue("id")));}this.tagName = localName;}/* * 接收文档的结尾的通知。 * 参数意义如下: *    uri :元素的命名空间 *    localName :元素的本地名称(不带前缀) *    name :元素的限定名(带前缀) *  */@Override public void endElement(String uri, String localName, String name) throws SAXException {if(localName.equals("person")){persons.add(currentPerson);currentPerson = null;}this.tagName = null;}}


4 使用

public static List<Person> readXML(InputStream inStream) {   try {SAXParserFactory spf = SAXParserFactory.newInstance();SAXParser saxParser = spf.newSAXParser(); //创建解析器//设置解析器的相关特性,http://xml.org/sax/features/namespaces = true 表示开启命名空间特性  saxParser.setProperty("http://xml.org/sax/features/namespaces",true);PersonContentHandler handler = new PersonContentHandler();saxParser.parse(inStream, handler);inStream.close();return handler.getPersons();   } catch (Exception e) {e.printStackTrace();   }  return null;}

更多相关文章

  1. android service 详解
  2. Android高手进阶教程(十七)之---Android中Intent传递对象的两种
  3. Android线程优先级设置方法
  4. 9、Android中Activity
  5. Android智能指针SP WP使用方法介绍
  6. 一步步探索学习Android(安卓)Touch事件分发传递机制(一)
  7. 浅谈Java中Collections.sort对List排序的两种方法
  8. mybatisplus的坑 insert标签insert into select无参数问题的解决
  9. Python list sort方法的具体使用

随机推荐

  1. 在线音乐播放器
  2. Android安全检查之Root环境检测
  3. Android之 系统启动流程
  4. Android 4.3发布 新增4大改变25日推送升
  5. Android 开发者调查
  6. [记录]Android虚拟机大屏幕设置
  7. 2011年,谁执Android手机的牛耳?
  8. Larry Page:Android是Google其他服務的載
  9. Android知识整理
  10. Android(安卓)SDK离线安装