Android中XML解析模塊的使用方法
在音樂跟電視的項目中,很多都是使用了典型的按照接口規范的流程處理方式。
客戶端發送一個request請求,服務端就會以xml的數據格式返回一個response響應。但是在客戶端界面展示xml數據并不是那么人性化與現實,所以在此之前,會對xml進行數據解析。縱觀軟終端的大部分項目中,在客戶端進行數據解析采用的是SAX(Simple API for XML),這是有道理的。
SAX的工作原理簡單地說就是對文檔進行順序掃描,當掃描到文檔(document)開始與結束、元素(element)開始與結束、文檔(document)結束等地方時通知事件處理函數,由事件處理函數做相應動作,然后繼續同樣的掃描,直至文檔結束。
大多數SAX實現都會產生以下類型的事件:
在文檔內每一XML元素接受解析的前后觸發元素事件。
在文檔的開始和結束時觸發文檔處理事件。
在處理文檔的DTD或Schema時產生DTD或Schema事件。
任何元數據通常都由單獨的事件交付。
產生錯誤事件用來通知主機應用程序解析錯誤。
對于如下文檔:
- <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接口的方法有以下幾種:
- 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接口包括以下兩個方法:
- 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)
- 接收警告的通知