在音樂跟電視的項目中,很多都是使用了典型的按照接口規范的流程處理方式。
例如上圖,客戶端發送一個request請求,服務端就會以xml的數據格式返回一個response響應。但是在客戶端界面展示xml數據并不是那么人性化與現實,所以在此之前,會對xml進行數據解析??v觀軟終端的大部分項目中,在客戶端進行數據解析采用的是SAX(Simple API for XML),這是有道理的。
SAX的工作原理簡單地說就是對文檔進行順序掃描,當掃描到文檔(document)開始與結束、元素(element)開始與結束、文檔(document)結束等地方時通知事件處理函數,由事件處理函數做相應動作,然后繼續同樣的掃描,直至文檔結束。
大多數SAX實現都會產生以下類型的事件
:
在文檔內每一XML元素接受解析的前后觸發元素事件。
在文檔的開始和結束時觸發文檔處理事件。
在處理文檔的DTD或Schema時產生DTD或Schema事件。
任何元數據通常都由單獨的事件交付。
產生錯誤事件用來通知主機應用程序解析錯誤。
對于如下文檔:
在解析文檔的過程中會產生如下一系列事件:
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)創建事件處理程序。
?。?)創建SAX解析器。
(4)對文檔進行解析,將每個事件發送給處理程序。
?。?)將事件處理程序分配給解析器。
SAX的優缺點
SAX的優點:
解析速度快
ContentHandler對象可以是多個
內存消耗少
SAX的缺點:
必須實現事件處理程序
不能修改文檔
不能隨機訪問
SAX解析器對文檔的解析過程是一種邊解析邊執行的過程
SAX解析器對文檔的解析過程中,無需把整個文檔都加載到內存中
使用SAX解析器時,可以注冊多個ContentHandler對象,并行接收事件
SAX解析器對文檔的解析是順序進行的
使用SAX對文檔進行解析,只能訪問文檔內容,無法做到向文檔中添加節點,更不能刪除和修改文檔中的內容。
SAX的常用接口介紹
ContentHandler接口
ContentHandler是Java類包中一個特殊的SAX接口,位于org.xml.sax包中。該接口封裝了一些對事件處理的方法,當XML解析器開始解析XML輸入文檔時,它會遇到某些特殊的事件,比如文檔的開頭和結束、元素開頭和結束、以及元素中的字符數據等事件。當遇到這些事件時,XML解析器會調用ContentHandler接口中相應的方法來響應該事件。
ContentHandler接口的方法有以下幾種:
DTDHandler接口
DTDHandler用于接收基本的DTD相關事件的通知。該接口位于org.xml.sax包中。此接口僅包括DTD事件的注釋和未解析的實體聲明部分。SAX解析器可按任何順序報告這些事件,而不管聲明注釋和未解析實體時所采用的順序;但是,必須在文檔處理程序的startDocument()事件之后,在第一個startElement()事件之前報告所有的DTD事件。
DTDHandler接口包括以下兩個方法:
接收注釋聲明事件的通知
接收未解析的實體聲明事件的通知
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)
接收警告的通知
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
