初识Android之xml解析

Android 作为一个开源移动开发平台,为用户提供了众多丰富有趣的功能,XML作为Internet 上的一种数据格式为其实现提供了一些特殊的支持。今天花了一些时间学习了下xml的解析,现在总结如下:

读取XML主要有2种方法:DOM和SAX,DOM(文档对象模型),为XML文档的解析定义了一组接口,解析器读入整个文档,构造一个驻留内存的树结构,然后代码就可以使用DOM接口来操组整个树结构,其优点是:整个文档树都在内存当中,便于操作;支持删除、修改、重新排列等多功能。缺点是:将整个文档调入内存(经常包含大量无用的节点),浪费时间和空间。这种方式的使用场合是:一旦解析了文档还需要多次访问这些数据,而且资源比较充足(如内存、CPU等)的情况。

为了解决DOM解析XML引起的这些问题,出现了SAX。SAX全称Simple API for XML,即指一种接口,也是指一个软件包。作为接口,SAX是事件驱动型XML解析的一个标准接口。SAX的工作原理简单地说就是对文档进行顺序扫描,当扫描到文档(documnet)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续做同样的扫描,直到文档结束。大多数SAX实现都会产生以下类型的事件:
    在文档的开始和结束时触发文档处理事件。
    在文档内每一XML元素接受解析的前后触发元素事件。
    任何元数据通常都由单独的事件交互。
    在处理文档的DTD或Schema时产生DTD或Schema事件。
    产生错误事件用来通知主机应用程序解析错误。

在SAX接口中,事件源是org.xml.sax包中的XMLReader,它通过parser()方法来开始解析XML文档,并根据文档的内容产生事件。而事件处理器则是org.xml.sax包中的ContentHander、DTDHander、ErrorHandler,以及EntityResolver这4个接口,它们分别处理事件源在解析XML文档过程中产生的不同种类的事件。而事件源XMLReader与这4个事件处理器的连接是通过在XMLReader中的相应事件处理器注册方法setXXXX()来完成的。

ContentHandler是Java类包中一个特殊的SAX接口,位于org.xml.sax包中。该接口封装了一些对事件处理的方法,当XML解析器开始解析XML输入文档时,其会遇到某些特殊的事件,比如文档的开头和结束,元素开头和结束,以及元素中的字符数据等事件。当遇到这些事件时,xml解析器会调用ContentHandler接口中相应的方法来响应该事件。主要方法有:void characters(char[] ch, int start, int length) ;void startDocument()
void startElement(String uri, String localName, String qName, Attributes atts)
void endDocument() ;void endElement(String uri, String localName, String qName) 。

ErrorHandler处理文档中产生的错误。主要方法有:void error(SAXParseException exception) ;
void fatalError(SAXParseException exception) ;void warning(SAXParseException exception) 。

DTDHandler处理对文档的DTD(Document Type Definition是一套关于标记符的语法规则)进行解析时产生的相应事件。主要方法有:void notationDecl(String name, String publicId, String systemId) ;
void unparsedEntityDecl(String name, String publicId, String systemId, String notationName) 。
    EntityResolver处理外部实体。主要方法有:abstract InputSource resolveEntity(String publicId, String systemId) 。

SAX的主要优点是:不用事先调入整个文档,占用资源少。尤其在嵌入式环境中,极力推荐采用SAX进行解析XML文档。主要缺点是:不像DOM一样将文档长期驻留在内存,数据不是持久的,事件过后,如没有保存数据,那么数据就会丢失。使用场合:机器性能有限,尤其是在嵌入式环境,如Android,极力推荐采用SAX进行解析XML文档。
    由于使用DOM方法需要将整个XML文档加载内存中,对系统资源占用比较多,这对内存比较紧张的Android系统来说,使用DOM方法读取XML文档会有很大的限制。通常使用SAX方法来读取XML,这样对内存资源的占用相对比较少,因此在嵌入式设备中极力推荐使用,Android也不例外。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值