在音樂跟電視的專案中,很多都是使用了典型的按照介面規範的流程處理方式。05174753_MOMn  


例如上圖,用戶端發送一個request請求,服務端就會以xml的資料格式返回一個response回應。但是在用戶端介面展示xml資料並不是那麼人性化與現實,所以在此之前,會對xml進行資料解析。縱觀軟終端的大部分專案中,在用戶端進行資料解析採用的是SAX(Simple API for XML),這是有道理的。

 

SAX的工作原理簡單地說就是對文檔進行順序掃描,當掃描到文檔(document)開始與結束、元素(element)開始與結束、文檔(document)結束等地方時通知事件處理函數,由事件處理函數做相應動作,然後繼續同樣的掃描,直至文檔結束。

 

大多數SAX實現都會產生以下類型的事件:
在文檔內每一XML元素接受解析的前後觸發元素事件。
在文檔的開始和結束時觸發文檔處理事件。
在處理文檔的DTD或Schema時產生DTD或Schema事件。
任何中繼資料通常都由單獨的事件交付。
產生錯誤事件用來通知主機應用程式解析錯誤。
對於如下文檔:

 

源碼copy to clipboard列印?
01.<doc>
02.  <para>Hello, world!</para>
03.  <title>sax parse xml</title>
04.</doc>
<doc>
  <para>Hello, world!</para>
  <title>sax parse xml</title>
</doc> 在解析文檔的過程中會產生如下一系列事件:
start document
start element: doc
start element: para
characters: Hello, world!
end element: para
stat element:title
characters:sax parse xml
end element:title
end element: doc
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介面的方法有以下幾種:

 

源碼copy to clipboard列印?
01.void startDocument()
02.void characters(char[ ] ch, int start, int length)
03.void endDocument()
04.void startElement(String uri, String localName, String qName, Attributes atts)
05.void endElement(String uri, String localName, String qName)
void startDocument()
void characters(char[ ] ch, int start, int length)
void endDocument()
void startElement(String uri, String localName, String qName, Attributes atts)
void endElement(String uri, String localName, String qName)
DTDHandler介面
DTDHandler用於接收基本的DTD相關事件的通知。該介面位於org.xml.sax包中。此介面僅包括DTD事件的注釋和未解析的實體宣告區段。SAX解析器可按任何順序報告這些事件,而不管聲明注釋和未解析實體時所採用的順序;但是,必須在文檔處理常式的startDocument()事件之後,在第一個startElement()事件之前報告所有的DTD事件。
DTDHandler介面包括以下兩個方法:

 

源碼copy to clipboard列印?
01.void startDocumevoid notationDecl(String name, String publicId, String systemId) nt()
02.void unparsedEntityDecl(String name, String publicId, String systemId, String notationName)
void startDocumevoid notationDecl(String name, String publicId, String systemId) nt()
void unparsedEntityDecl(String name, String publicId, String systemId, String notationName) 接收注釋聲明事件的通知
接收未解析的實體聲明事件的通知
EntityResolver介面
EntityResolver介面是用於解析實體的基本介面,該介面位於org.xml.sax包中。

 

該介面只有一個方法,如下:
public InputSource resolveEntity(String publicId, String systemId)
允許應用程式解析外部實體。並返回一個InputSource類的物件或者為null,用於讀取實體資訊
解析器將在打開任何外部實體前調用此方法。此類實體包括在DTD內引用的外部DTD子集和外部參數實體和在文件項目內引用的外部通用實體等。如果SAX應用程式需要實現自訂處理外部實體,則必須實現此介面。

 

ErrorHandler介面
ErrorHandler介面是SAX錯誤處理常式的基本介面。如果SAX應用程式需要實現自訂的錯誤處理,則它必須實現此介面,然後解析器將通過此介面報告所有的錯誤和警告。

 

該介面的方法如下:
void error(SAXParseException exception)
void fatalError(SAXParseException exception)
接收可恢復的錯誤通知
接收不可恢復的錯誤通知
void warning(SAXParseException exception)
接收警告的通知







原文連結:HTTP://blog.csdn.net/sunchaoenter/article/details/6590088
arrow
arrow
    全站熱搜

    戮克 發表在 痞客邦 留言(0) 人氣()