当前位置:文档之家› android 中对xml 进行解析

android 中对xml 进行解析

DOM解析器是通过将XML文档解析成树状模型并将其放入内存来完成解析工作的,而后对文档的操作都是在这个树状模型上完成的。

这个在内存中的文档树将是文档实际大小的几倍。

这样做的好处是结构清除、操作方便,而带来的麻烦就是极其耗费系统资源。

而SAX正好克服了DOM的缺点,分析能够立即开始,而不是等待所有的数据被处理。

而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中,这对于大型文档来说是个巨大的优点。

事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。

选择DOM 还是选择SAX,这取决于下面几个因素:应用程序的目的:如果打算对数据作出更改并将它输出为XML,那么在大多数情况下,DOM 是适当的选择。

并不是说使用SAX 就不能更改数据,但是该过程要复杂得多,因为您必须对数据的一份拷贝而不是对数据本身作出更改。

数据容量:对于大型文件,SAX 是更好的选择。

数据将如何使用:如果只有数据中的少量部分会被使用,那么使用SAX 来将该部分数据提取到应用程序中可能更好。

另一方面,如果您知道自己以后会回头引用已处理过的大量信息,那么SAX 也许不是恰当的选择。

对速度的需要:SAX 实现通常要比DOM 实现更快。

基于上面的分析,在基于Android系统的内存和CPU资源比较有限的手持设备上,只要我们不需要修改XML数据或者随机的访问XML数据,SAX尽管可能需要更多的编码工作,但是为了更小的内存和CPU 消耗,还是值得的。

另外,Android SDK中已经包含了JAXP对应的javax.xml.parsers包,和SAX对应org.xml.sax(当然DOM对应的org.w3c.dom包也包含在内),加上Android还提供了android.sax这样的包来方便SAX Handle的开发,基于JAXP和SAX这样的标准方法来开发不仅复杂度不高,即使出现问题在讨论组中寻求解决方案也是比较容易的。

android 中的xml解析应该是和java中一条道路主要分为sax 解析和的Dom 解析。

如下的介绍的相关的包和类均为android 环境下:sax解析对应为:org\xml\sax 包:xml解析javax.xml.parsers.SAXParserFactoryjavax.xml.parsers.SAXParser两个主要用于SAXParser的上下文建立示例如下:SAXParserFactory factory = SAXParserFactory.newInstance();SAXParser parser = factory.newSAXParser();ParseXML parX = new ParseXML();parser.parse("F:\\emps.xml", parX);这里的ParseXML 一般是继承于org.xml.sax.helpers.DefaultHandler类的解析实现。

因为Sax 对xml的解析是基于事件类型的,也就是Sax Parser逐步的读取xml文件,然后碰到一个节点,一个属性,碰到一个节点的结束等事件都会回调哦org.xml.sax.helpers.DefaultHandler 之类的实现,然后在Hander 的实现中具体解析各个节点名称,属性名称。

通过以上的特点可以看出sax有速度快(不需要全部的读入内存并构建树),消耗的内存较少,线性的从上往下解析,所以它比较的适合于xml文件大,速度要求高,解析结构自上而下如把html展示出来,xml转为html等。

Dom解析对应为:org\w3c\dom包:xml的各个元素对应类javax.xml.parsers.DocumentBuilderFactoryjavax.xml.parsers.DocumentBuilder结构也和sax 一样,最终的解析目标指向org.w3c.dom.Document.示例如下:File docFile = new File("orders.xml");Document doc = null;DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();DocumentBuilder db = dbf.newDocumentBuilder();doc = db.parse(docFile); // get the document.因为Dom 是基于树结构,所以要全部结构内容读入内容,构造树,所以比较花费时间,但是dom 的操作可以反复的来回操作,灵活性比较高,做出的程序结构也比较容易认可,对于那些性能要求不是很高的,内容比较少的,xml上下结构比较复杂的用dom应该是比较好的选择了。

因为在开发中,我们会常用到xml文件的读写操作,因为手机操作有很多版本问题和很多小数据在数据库不是良好的解决方案。

所以会用到很多xml操作。

android开发一般对xml操作常用三种技术:sax、dom、pull分别详细的进行介绍:首先创建开发测试坏境(一下三种方法都会使用这个环境):在类路径下面创建xml文件:person.xml<?xml version="1.0" encoding="UTF-8"?><persons><person id="1"><name>王昌龙</name><age>23</age></person><person id="3"><name>小妾</name><age>17</age></person></persons>(我的名字and因为没有媳妇,就假设叫小妾)针对person创建javabean,(因为我们下面要以对象的形式获取此xml文件内容)package cn.partner4java.xml.bean;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) { = name;}public short getAge() {return age;}public void setAge(short age) {this.age = age;}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + id;return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;Person other = (Person) obj;if (id != other.id)return false;return true;}}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)就可以获取内容。

不知道你看懂上面的解释了么?那好,我们动手做一下:创建XMLContentHandler,如上面说的应该实现ContentHandler接口,但是我们这里去集成一个它的实现类就OL,package cn.partner4java.sax.service;import java.util.ArrayList;import java.util.List;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;import cn.partner4java.sax.bean.Person;public class XMLContentHandler extends DefaultHandler {private List<Person> persons;private Person person;private String preTag;public List<Person> getPersons() {return persons;}//这个方法用来处理在XML文件中读到的内容,第一个参数为文件的字符串内容,后面两个参数是读到的字符串在这个数组中的起始位置和长度,//使用new String(ch,start,length)就可以获取内容。

相关主题