自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

移動(dòng)開(kāi)發(fā) Android
客戶(hù)端發(fā)送一個(gè)request請(qǐng)求,服務(wù)端就會(huì)以xml的數(shù)據(jù)格式返回一個(gè)response響應(yīng)。但是在客戶(hù)端界面展示xml數(shù)據(jù)并不是那么人性化與現(xiàn)實(shí),所以在此之前,會(huì)對(duì)xml進(jìn)行數(shù)據(jù)解析??v觀(guān)軟終端的大部分項(xiàng)目中,在客戶(hù)端進(jìn)行數(shù)據(jù)解析采用的是SAX(Simple API for XML),這是有道理的。

在音樂(lè)跟電視的項(xiàng)目中,很多都是使用了典型的按照接口規(guī)范的流程處理方式。

客戶(hù)端發(fā)送一個(gè)request請(qǐng)求,服務(wù)端就會(huì)以xml的數(shù)據(jù)格式返回一個(gè)response響應(yīng)。但是在客戶(hù)端界面展示xml數(shù)據(jù)并不是那么人性化與現(xiàn)實(shí),所以在此之前,會(huì)對(duì)xml進(jìn)行數(shù)據(jù)解析。縱觀(guān)軟終端的大部分項(xiàng)目中,在客戶(hù)端進(jìn)行數(shù)據(jù)解析采用的是SAX(Simple API for XML),這是有道理的。

SAX的工作原理簡(jiǎn)單地說(shuō)就是對(duì)文檔進(jìn)行順序掃描,當(dāng)掃描到文檔(document)開(kāi)始與結(jié)束、元素(element)開(kāi)始與結(jié)束、文檔(document)結(jié)束等地方時(shí)通知事件處理函數(shù),由事件處理函數(shù)做相應(yīng)動(dòng)作,然后繼續(xù)同樣的掃描,直至文檔結(jié)束。

大多數(shù)SAX實(shí)現(xiàn)都會(huì)產(chǎn)生以下類(lèi)型的事件

在文檔內(nèi)每一XML元素接受解析的前后觸發(fā)元素事件。

在文檔的開(kāi)始和結(jié)束時(shí)觸發(fā)文檔處理事件。

在處理文檔的DTD或Schema時(shí)產(chǎn)生DTD或Schema事件。

任何元數(shù)據(jù)通常都由單獨(dú)的事件交付。

產(chǎn)生錯(cuò)誤事件用來(lái)通知主機(jī)應(yīng)用程序解析錯(cuò)誤。

對(duì)于如下文檔:

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

在解析文檔的過(guò)程中會(huì)產(chǎn)生如下一系列事件:

  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 

一個(gè)完整的SAX處理過(guò)程涉及如下幾個(gè)步驟:

(1)創(chuàng)建事件處理程序。

(2)創(chuàng)建SAX解析器。

(4)對(duì)文檔進(jìn)行解析,將每個(gè)事件發(fā)送給處理程序。

(3)將事件處理程序分配給解析器。

SAX的優(yōu)缺點(diǎn)

SAX的優(yōu)點(diǎn):

解析速度快

ContentHandler對(duì)象可以是多個(gè)

內(nèi)存消耗少

SAX的缺點(diǎn):

必須實(shí)現(xiàn)事件處理程序

不能修改文檔

不能隨機(jī)訪(fǎng)問(wèn)

SAX解析器對(duì)文檔的解析過(guò)程是一種邊解析邊執(zhí)行的過(guò)程

SAX解析器對(duì)文檔的解析過(guò)程中,無(wú)需把整個(gè)文檔都加載到內(nèi)存中

使用SAX解析器時(shí),可以注冊(cè)多個(gè)ContentHandler對(duì)象,并行接收事件

SAX解析器對(duì)文檔的解析是順序進(jìn)行的

使用SAX對(duì)文檔進(jìn)行解析,只能訪(fǎng)問(wèn)文檔內(nèi)容,無(wú)法做到向文檔中添加節(jié)點(diǎn),更不能刪除和修改文檔中的內(nèi)容。

SAX的常用接口介紹

ContentHandler接口

ContentHandler是Java類(lèi)包中一個(gè)特殊的SAX接口,位于org.xml.sax包中。該接口封裝了一些對(duì)事件處理的方法,當(dāng)XML解析 器開(kāi)始解析XML輸入文檔時(shí),它會(huì)遇到某些特殊的事件,比如文檔的開(kāi)頭和結(jié)束、元素開(kāi)頭和結(jié)束、以及元素中的字符數(shù)據(jù)等事件。當(dāng)遇到這些事件時(shí),XML解 析器會(huì)調(diào)用ContentHandler接口中相應(yīng)的方法來(lái)響應(yīng)該事件。

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相關(guān)事件的通知。該接口位于org.xml.sax包中。此接口僅包括DTD事件的注釋和未解析的實(shí)體聲明部 分。SAX解析器可按任何順序報(bào)告這些事件,而不管聲明注釋和未解析實(shí)體時(shí)所采用的順序;但是,必須在文檔處理程序的startDocument()事件 之后,在第一個(gè)startElement()事件之前報(bào)告所有的DTD事件。

DTDHandler接口包括以下兩個(gè)方法:

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

接收注釋聲明事件的通知

接收未解析的實(shí)體聲明事件的通知

EntityResolver接口

EntityResolver接口是用于解析實(shí)體的基本接口,該接口位于org.xml.sax包中。

該接口只有一個(gè)方法,如下

 

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

允許應(yīng)用程序解析外部實(shí)體。并返回一個(gè)InputSource類(lèi)的對(duì)象或者為null,用于讀取實(shí)體信息

解析器將在打開(kāi)任何外部實(shí)體前調(diào)用此方法。此類(lèi)實(shí)體包括在DTD內(nèi)引用的外部DTD子集和外部參數(shù)實(shí)體和在文檔元素內(nèi)引用的外部通用實(shí)體等。如果SAX應(yīng)用程序需要實(shí)現(xiàn)自定義處理外部實(shí)體,則必須實(shí)現(xiàn)此接口。

ErrorHandler接口

ErrorHandler接口是SAX錯(cuò)誤處理程序的基本接口。如果SAX應(yīng)用程序需要實(shí)現(xiàn)自定義的錯(cuò)誤處理,則它必須實(shí)現(xiàn)此接口,然后解析器將通過(guò)此接口報(bào)告所有的錯(cuò)誤和警告。

該接口的方法如下:

  1. void error(SAXParseException exception) 
  2. void fatalError(SAXParseException exception) 
  3. 接收可恢復(fù)的錯(cuò)誤通知 
  4. 接收不可恢復(fù)的錯(cuò)誤通知 
  5. void warning(SAXParseException exception) 
  6. 接收警告的通知 

 

責(zé)任編輯:閆佳明 來(lái)源: my.eoe.cn
相關(guān)推薦

2010-10-08 14:27:25

JavascriptSplit

2011-06-14 10:18:58

QThread Qt 線(xiàn)程

2010-08-09 10:16:01

FlexBuilder

2011-08-11 17:00:33

iPhone數(shù)據(jù)庫(kù)SQLite

2011-08-29 15:58:51

Lua函數(shù)

2009-11-25 10:02:27

PHP會(huì)話(huà)Sessio

2011-08-19 13:51:12

2010-01-25 18:22:33

Android使用XM

2011-06-30 16:53:18

QT Creator TableWidge

2010-06-12 16:30:51

UML設(shè)計(jì)

2010-11-19 09:56:38

SQLiteAndroid

2010-01-28 17:07:03

Android Gal

2011-08-23 09:44:28

LUA腳本

2024-01-02 09:21:18

SqlSugar數(shù)據(jù)庫(kù)ORM框架

2009-02-17 11:23:08

2010-10-09 10:30:03

JS event

2009-09-23 13:23:12

Hibernate M

2018-06-20 10:34:56

堆棧iOSswift

2021-05-08 06:14:28

Vue.js片段開(kāi)發(fā)

2021-07-16 07:57:35

JavaScriptEval函數(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)