Android中XML解析模块的使用方法

移动开发 Android
客户端发送一个request请求,服务端就会以xml的数据格式返回一个response响应。但是在客户端界面展示xml数据并不是那么人性化与现实,所以在此之前,会对xml进行数据解析。纵观软终端的大部分项目中,在客户端进行数据解析采用的是SAX(Simple API for XML),这是有道理的。

在音乐跟电视的项目中,很多都是使用了典型的按照接口规范的流程处理方式。

客户端发送一个request请求,服务端就会以xml的数据格式返回一个response响应。但是在客户端界面展示xml数据并不是那么人性化与现实,所以在此之前,会对xml进行数据解析。纵观软终端的大部分项目中,在客户端进行数据解析采用的是SAX(Simple API for XML),这是有道理的。

SAX的工作原理简单地说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。

大多数SAX实现都会产生以下类型的事件

在文档内每一XML元素接受解析的前后触发元素事件。

在文档的开始和结束时触发文档处理事件。

在处理文档的DTD或Schema时产生DTD或Schema事件。

任何元数据通常都由单独的事件交付。

产生错误事件用来通知主机应用程序解析错误。

对于如下文档:

  1. <doc> 
  2. <para>Hello, world!</para> 
  3. <title>sax parse xml</title> 
  4. </doc> 

在解析文档的过程中会产生如下一系列事件:

  1. start document 
  2. start element: doc 
  3. start element: para 
  4. characters: Hello, world! 
  5. end element: para 
  6. stat element:title 
  7. characters:sax parse xml 
  8. end element:title 
  9. end element: doc 
  10. end document 

一个完整的SAX处理过程涉及如下几个步骤:

(1)创建事件处理程序。

(2)创建SAX解析器。

(4)对文档进行解析,将每个事件发送给处理程序。

(3)将事件处理程序分配给解析器。

SAX的优缺点

SAX的优点:

解析速度快

ContentHandler对象可以是多个

内存消耗少

SAX的缺点:

必须实现事件处理程序

不能修改文档

不能随机访问

SAX解析器对文档的解析过程是一种边解析边执行的过程

SAX解析器对文档的解析过程中,无需把整个文档都加载到内存中

使用SAX解析器时,可以注册多个ContentHandler对象,并行接收事件

SAX解析器对文档的解析是顺序进行的

使用SAX对文档进行解析,只能访问文档内容,无法做到向文档中添加节点,更不能删除和修改文档中的内容。

SAX的常用接口介绍

ContentHandler接口

ContentHandler是Java类包中一个特殊的SAX接口,位于org.xml.sax包中。该接口封装了一些对事件处理的方法,当XML解析 器开始解析XML输入文档时,它会遇到某些特殊的事件,比如文档的开头和结束、元素开头和结束、以及元素中的字符数据等事件。当遇到这些事件时,XML解 析器会调用ContentHandler接口中相应的方法来响应该事件。

ContentHandler接口的方法有以下几种:

  1. void startDocument() 
  2. void characters(char[ ] ch, int start, int length) 
  3. void endDocument() 
  4. void startElement(String uri, String localName, String qName, Attributes atts) 
  5. void endElement(String uri, String localName, String qName) 

DTDHandler接口

DTDHandler用于接收基本的DTD相关事件的通知。该接口位于org.xml.sax包中。此接口仅包括DTD事件的注释和未解析的实体声明部 分。SAX解析器可按任何顺序报告这些事件,而不管声明注释和未解析实体时所采用的顺序;但是,必须在文档处理程序的startDocument()事件 之后,在第一个startElement()事件之前报告所有的DTD事件。

DTDHandler接口包括以下两个方法:

  1. void startDocumevoid notationDecl(String name, String publicId, String systemId) nt() 
  2. void unparsedEntityDecl(String name, String publicId, String systemId, String notationName) 

接收注释声明事件的通知

接收未解析的实体声明事件的通知

EntityResolver接口

EntityResolver接口是用于解析实体的基本接口,该接口位于org.xml.sax包中。

该接口只有一个方法,如下

 

  1. public InputSource resolveEntity(String publicId, String systemId)  

允许应用程序解析外部实体。并返回一个InputSource类的对象或者为null,用于读取实体信息

解析器将在打开任何外部实体前调用此方法。此类实体包括在DTD内引用的外部DTD子集和外部参数实体和在文档元素内引用的外部通用实体等。如果SAX应用程序需要实现自定义处理外部实体,则必须实现此接口。

ErrorHandler接口

ErrorHandler接口是SAX错误处理程序的基本接口。如果SAX应用程序需要实现自定义的错误处理,则它必须实现此接口,然后解析器将通过此接口报告所有的错误和警告。

该接口的方法如下:

  1. void error(SAXParseException exception) 
  2. void fatalError(SAXParseException exception) 
  3. 接收可恢复的错误通知 
  4. 接收不可恢复的错误通知 
  5. void warning(SAXParseException exception) 
  6. 接收警告的通知 

 

责任编辑:闫佳明 来源: my.eoe.cn
相关推荐

2010-10-08 14:27:25

JavascriptSplit

2011-06-14 10:18:58

QThread Qt 线程

2010-08-09 10:16:01

FlexBuilder

2011-08-11 17:00:33

iPhone数据库SQLite

2011-08-29 15:58:51

Lua函数

2009-11-25 10:02:27

PHP会话Sessio

2010-01-25 18:22:33

Android使用XM

2011-08-19 13:51:12

2010-11-19 09:56:38

SQLiteAndroid

2010-06-12 16:30:51

UML设计

2011-06-30 16:53:18

QT Creator TableWidge

2010-01-28 17:07:03

Android Gal

2011-08-23 09:44:28

LUA脚本

2018-06-20 10:34:56

堆栈iOSswift

2009-09-23 13:23:12

Hibernate M

2021-05-08 06:14:28

Vue.js片段开发

2021-07-16 07:57:35

JavaScriptEval函数

2010-10-09 10:30:03

JS event

2024-01-02 09:21:18

SqlSugar数据库ORM框架

2009-02-17 11:23:08

点赞
收藏

51CTO技术栈公众号