前面介紹了四種建立、解析XML的方式:
0、 Android 建立與解析XML(一)—— 概述
1、 Android 建立與解析XML(二)—— Dom方式
2、 Android 建立與解析XML(三)—— Sax方式
3、 Android 建立與解析XML(四)—— Pull方式
4、 Android 建立與解析XML(五)—— Dom4j方式
其中,從處理方式看,有的採用了Java處理XML的標準方式,有的是經過第三方改進後的XML處理方式;從事件角度看,有的是基於Dom樹節點,有的基於事件處理
為什麼建立、解析XML會產生這麼多方法呢?四種處理方式的特點各是什嗎?它們分別更適合什麼樣的使用情境呢?
一、 XML 通用標準
XML 世界非常龐大,而且還在不斷成長,存在大量不同的標準和技術,它們以複雜的方式互相影響。
XML 正在變得越來越強大,並且得到了迅速的發展,它已經證明自己是一種非常有價值的技術,但可能也是一種令人害怕的技術,如果考慮到掛在“XML”一詞下面不斷變化的各個部分,新手很難確定哪些是 XML 最重要的方面,使用者也難以跟蹤這個領域出現的新生事物和變化。
標準,有各種各樣的形式,而且在同一個領域中常常有多種標準互相競爭,此處把標準定義為:被不同的供應商大量採用的或者有影響的、獨立於供應商的組織推薦的規範。
1) XML 1.0 ,W3C 推薦的標準,衍生出 XML 技術大樹的主幹。它在 Unicode [Unicode Consortium 技術報告和 ISO 標準]的基礎上定義了文字格式設定的嚴格規則,以及 DTD (文件類型定義,Document Type Definition)驗證語言。該規範的目前的版本(第 2 版)包含了規範的曆次修訂。它被 翻譯成多種語言,儘管英語版本是唯一的規範版本,就是說只有這個版本被認為具有標準的效力。
2) XML 1.1 ,正在開發中,是改變了結構良好的 XML 文檔的定義的第一個修訂版。主要的變化是修訂了 XML 規範中對字元的處理,使其更自然地適應 Unicode 規範的變化,並通過引用 全球資訊網字元模型(Character Model for the World Wide Web 1.0)[開發中],提供了不同 Unicode 版本字元的正常化。XML 1.1 還增加了行結束字元列表,新增加的 NEL 用於在 IBM 大型主機系統中表示行結束(EOL)。這種變化存在爭議,有人認為對大型主機使用者帶來的有限好處不值得做這種基礎性的改變。還有一些其他的爭論,因為一些評論者發現所有的修改都太穩妥了,在 XML 版本變換中不會造成各種可能的互通性問題。
XML 是基於 Standard Generalized Markup Language(標準通用標記語言 (SGML),SGML)的,後者由 ISO 8879:1986 [ISO 標準]定義。它在很大程度上簡化了 SGML,包括一些調整使其更適合於 Web 環境。
二、 XML處理方式
大多數與XML 相關的Java API 在Android 上得到了完全支援,在Android 上可以建立功能強大的行動裝置 App程式,而在Android 上解析XML的技術有三種DOM、SAX、PULL。
1) DOM 解析技術
DOM(Document Object Model,文件物件模型),Android 完全支援DOM 解析,利用DOM 中的對象,可以對XML 文檔進行讀取、搜尋、修改、添加和刪除等操作。
使用DOM 對XML 檔案進行操作時,首先要解析檔案,將檔案分為獨立的元素、屬性和注釋等,然後以節點樹的形式在記憶體中對XML 檔案進行表示,就可以通過節點樹訪問文檔的內容,並根據需要修改文檔——這就是DOM的工作原理。DOM 實現時首先為XML 文檔的解析定義一組介面,解析器讀入整個文檔,然後構造一個駐留記憶體的樹結構,這樣代碼就可以使用DOM介面來操作整個樹結構。
DOM 解析流程:
2) SAX 解析技術
SAX(Simple API for XML,XML 簡單應用程式介面),是一個公用的基於事件的XML 文檔解析標準。它以事件作為解析XML 檔案的模式,它將XML 檔案轉化成一系列的事件,由不同的事件處理器來決定如何處理。SAX是一個解析速度快並且佔用記憶體少的xml解析器,非常適合android等行動裝置,SAX解析XML檔案採用的是事件驅動,也就是說,它並不需要解析完整個文檔,在按內容順序解析文檔的過程中,SAX會判斷當前讀取到的字元是否合法xml文法中的某部分,如果符合就會觸發事件。
SAX解析流程:
3) PULL解析技術
Android API 中,另外提供了Android.util.Xml 類,同樣可以解析XML 檔案,使用方法類似SAX,也都需編寫Handler來處理XML 的解析,但是在使用上卻比SAX 來得簡單。它允許使用者的應用程式代碼從解析器中擷取事件,這與SAX 解析器自動將事件推入處理常式相反。Pull解析器運行方式與SAX解析器類似,它提供了類似ide事件,如:開始元素和結束元素,使用parser.next()可以進入下一個元素並觸發相應的事件。事件作為數值代碼被發送,因此可以使用一個switch對感興趣的事件進行處理。當元素開始解析時,調用parser.nextText()方法擷取一個Text類型的節點的值。
PULL解析流程:
三、 XML效能比較
四、 使用情境
DOM解析器,是通過將XML文檔解析成樹狀模型並將其放入記憶體來完成解析工作的,而後對文檔的操作都是在這個樹狀模型上完成的。這個在記憶體中的文檔樹將是文檔實際大小的幾倍。這樣做的好處是結構清除、操作方便,而帶來的麻煩就是極其耗費系統資源。
SAX解析器,正好克服了DOM的缺點,分析能夠立即開始,而不是等待所有的資料被處理。而且,由於應用程式只是在讀取資料時檢查資料,因此不需要將資料存放區在記憶體中,這對於大型文檔來說是個巨大的優點。事實上,應用程式甚至不必解析整個文檔;它可以在某個條件得到滿足時停止解析。
選擇何種XML解析技術,取決於下面幾個因素:
(1) 應用目的:如果打算對資料作出更改並將它輸出為 XML,那麼在大多數情況下,DOM 是適當的選擇。並不是說使用 SAX和PULL 就不能更改資料,但是該過程要複雜得多,因為您必須對資料的一份拷貝而不是對資料本身作出更改。
(2) 資料容量: 對於大型檔案,SAX和PULL 是更好的選擇。
(3) 資料使用:如果只有資料中的少量部分會被使用,那麼使用 SAX,PULL來將該部分資料提取到應用程式中可能更好。另一方面,如果您知道自己以後會回頭引用已處理過的大量資訊,那麼 SAX,PULL也許不是恰當的選擇。
(4) 速度需要: SAX,PULL實現通常要比 DOM 實現更快。
(5) 添加節點:為了能動態給xml添加節點,推薦使用DOM。
(6) 在SAX和PULL都可以使用的情況下,建議使用PULL來解析。
五、 總結
對於Android 的行動裝置而言,因為裝置的資源比較寶貴,記憶體是有限的,所以我們需要選擇適合的技術來解析XML,這樣有利於提高訪問的速度。
(1) DOM 在處理XML 檔案時,將XML 檔案解析成樹狀結構並放入記憶體中進行處理。當XML 檔案較小時,我們可以選DOM,因為它簡單、直觀。
(2) SAX 則是以事件作為解析XML 檔案的模式,它將XML 檔案轉化成一系列的事件,由不同的事件處理器來決定如何處理。XML 檔案較大時,選擇SAX 技術是比較合理的。雖然代碼量有些大,但是它不需要將所有的XML 檔案載入到記憶體中。這樣對於有限的Android 記憶體更有效,而且Android 提供了一種傳統的SAX 使用方法以及一個便捷的SAX 封裝器。使用Android.util.Xml 類。
(3) PULL解析並未像SAX 解析那樣監聽元素的結束,而是在開始處完成了大部分處理。這有利於提早讀取XML 檔案,可以極大的減少解析時間,這種最佳化對於連線速度較慢的行動裝置而言尤為重要。對於XML 文檔較大但只需要文檔的一部分時,PULL解析器則是更為有效方法。
參考推薦:
XML 標準概覽(IBM)
Android實現XML解析技術
Android系統中XML解析方案的選擇
Android平台上的XML解析技術分析
W3C
W3C Schools(英文)
W3C Schools(中文)