Android 創建與解析XML(一)—— 概述
Android 是最常用的智能手機平臺,XML 是數據交換的標準媒介,Android 中可以使用標準的XML生成器、解析器、轉換器 API,對 XML 進行解析和轉換。
XML,相關有DOM、SAX、JDOM、DOM4J、Xerces、JAXP等一堆概念,但是很多人總是會弄混他們之間的關系,這對我們理解XML文件的創建和解析很不利。要挑選一個適合在Android平臺上使用的XML解析方案,我們還是得先把這些概念厘清。
XML基本概念
DOM(Document Object Model,文檔對象模型)和SAX(Simple API for XML,簡單XML應用接口),是JAXP(Java API for XML Processing,Java XML處理的應用接口)定義的2種不同的對XML文檔進行分析、處理的方法。
DOM方法是用標準對象模型表示 XML 文檔;SAX方法則使用事件模型來處理程序來處理XML。
JAXP完成了對SAX、DOM的包裝,它向應用程序提供針對DOM的DocumentBuilderFactory、 DocumentBuilder;以及針對SAX的SAXParserFactory、SAXParser抽象工廠類。在Jave SE中JAXP對應javax.xml.parsers包,DOM對應org.w3c.dom,SAX對應org.xml.sax。
Xerces首先繼承並實現了javax.xml.parser包內的SAXParser、SAXParserFactory、DocumentBuilder、DocumentBuilderFactory等抽象類,並提供了JAXP中所定義的DOM、SAX(以及StAX,後面會介紹)這些XML解析方法的實現和相應的Parser。
JDOM
XML創建與解析
XML創建主要四種方式:Dom、Sax、Pull、Dom4j
XML解析主要四種方式:Dom、Sax、Pull、Dom4j
其中,利用Dom、Sax、Pull、Dom4j創建的標準XML格式文件,可以由任何一種Dom、Sax、Pull、Dom4j解析方式進行解析。
Android中解析XML
DOM解析器,是通過將XML文檔解析成樹狀模型並將其放入內存來完成解析工作的,然後對文檔的操作都是在這個樹狀模型上完成的。這個在內存中的文檔樹將是文檔實際大小的幾倍。這樣做的好處是結構清晰、操作方便,而帶來的麻煩就是極其耗費系統資源。SAX解析器,正好克服了DOM的缺點,分析能夠立即開始,而不是等待所有的數據被處理。而且,由於應用程序只是在讀取數據時檢查數據,因此不需要將數據存儲在內存中,這對於大型文檔來說是個巨大的優點。事實上,應用程序甚至不必解析整個文檔,它可以在某個條件得到滿足時停止解析。
DOM與SAX比較
下面的表格列出了SAX和DOM在一些方面的對照:
SAX | DOM |
順序讀入文檔並產生相應事件,可以處理任何大小的XML文檔 | 在內存中創建文檔樹,不適於處理大型XML文檔。 |
只能對文檔按順序解析一遍,不支持對文檔的隨意訪問。 | 可以隨意訪問文檔樹的任何部分,沒有次數限制。 |
只能讀取XML文檔內容,而不能修改 | 可以隨意修改文檔樹,從而修改XML文檔。 |
開發上比較復雜,需要自己來實現事件處理器。 | 易於理解,易於開發。 |
對開發人員而言更靈活,可以用SAX創建自己的XML對象模型。 | 已經在DOM基礎之上創建好了文檔樹。 |
通過對SAX和DOM的分析,它們各有自己的不同應用領域:
SAX適於處理下面的問題:- 對大型文檔進行處理。
- 只需要文檔的部分內容,或者只需要從文檔中得到特定信息。
- 想創建自己的對象模型的時候。
DOM適於處理下面的問題:
- 需要對文檔進行修改
- 需要隨機對文檔進行訪問,例如XSLT解析器。
DOM和SAX的應用場景
1、數據修改:如果打算對數據作出更改並將它輸出為 XML,那麽在大多數情況下,DOM 是適當的選擇。並不是說使用 SAX 就不能更改數據,但是該過程要復雜得多,因為您必須對數據的一份拷貝而不是對數據本身作出更改。
2、數據容量: 對於大型文件,SAX 是更好的選擇。
3、數據使用:如果只有數據中的少量部分會被使用,那麽使用 SAX 來將該部分數據提取到應用程序中可能更好。 另一方面,如果您知道自己以後會回頭引用已處理過的大量信息,那麽 SAX 也許不是恰當的選擇。
4、速度要求: SAX 實現通常要比 DOM 實現速度更快。
基於上面的分析,在基於Android系統的內存和CPU資源比較有限的手持設備上,只要我們不需要修改XML數據或者隨機的訪問XML數據,SAX盡管可能需要更多的編碼工作,但是為了更小的內存和CPU消耗,還是值得的。
另外,Android SDK中已經包含了JAXP對應的javax.xml.parsers包,SAX對應org.xml.sax,DOM對應的org.w3c.dom包,加上Android還提供了android.sax這樣的包來方便SAX Handle的開發,基於JAXP和SAX這樣的標準方法來開發不僅復雜度不高,即使出現問題在討論組中尋求解決方案也是比較容易的。(參考: 使用 SAX 處理 XML 文檔 和 DOM SAX JAXP DOM4J JDOM xerces解析器)
Android中解析XML實現
基於上面的分析,采用JAXP+SAX的方案是我比較看好的。我們首先需要又一個SAXParserFactory的實例,然後從工廠中得到一個SAXParser實例,進而獲取一個XMLReader;接下來新建一個Handler類繼承自SAX Helpler的DefaultHandler,並實現startDocument()、startElement()、endElement()以及endDocument()等方法,並把這個Handler作為XMLReader的Content Handler;最後以帶解析的XML文檔為參數調用XMLReader的parse方法即可。具體的代碼參考:Android 上使用 XML 和 Android 3.0 平臺上創建和解析 XML
1、Android系統中的DOM和SAX實現
Android SDK中包含了JAXP對應javax.xml.parsers包,SAX對應的org.xml.sax,DOM對應的org.w3c.dom包,所以我們就已經有了XML解析所需的JAXP——對SAX和DOM的封裝(抽象類)以及SAX和DOM接口類,但是對於JAXP抽象類的實現,以及DOM和SAX接口類的實現在哪裏呢?是和Java SE 5.0一樣用了Xerces嗎? 不!
通過查看Android 1.5的源代碼,我看到這部分的代碼來自Apache Harmony這個開源的Java SE實現,位於./dalvik/libcore/xml/src/main/java/org/apache/harmony/xml目錄。這裏包含有一個完整的DOM實現(dom目錄),對於javax.xml.parser下的抽象類的實現(parser目錄),以及對於SAX接口類的實現(除此以外還包括對XMLPullParser接口的實現)。
2、XmlPull 和 KXML2
XmlPull解析器,提供了資源有限的環境(如J2ME)應用使用的XML解析API,XPP提供了非常簡單的接口——包含一個接口、一個異常、一個建立解析器的factory。它采用了類似JAXP的工廠模式,把接口設計和實現分離,KXML2就是一個為J2ME環境優化的一個實現。在Android SDK中,已經包含了XmlPull(org.xmlpull.v1包)以及它的一個AddOn——SAX2 Driver——它使得我們可以通過SAX2的API來操縱XmlPull Parser。另外,通過sourcecode,我們可以看到Android SDK中的XmlPull的實現是KXML2,位於./dalvik/libcore/xml/src/main/java/org/kxml2目錄。Apache Harmony的目錄中同樣有一個ExpatPullParser類實現了XMLPullParser接口,但是卻沒有XmlSerializer接口的實現,所以只能說Android中的Harmony也部分實現了XmlPull API。XmlPull+KXML2是下一步我要實踐的方案,到時候還得學習一下如何“公平”的比較兩者的性能。
3、StAX
盡管Android中還沒有提供相應的支持,但是Streaming API for XML (StAX) 作為用Java語言處理 XML的最新標準,無論從性能還是可用性上都有出色的表現。它不僅提供了一個快捷、易用、占用內存少的 XML 解析器,它還提供了過濾器接口,允許程序員向應用程序業務邏輯隱藏不需要的文檔細節。感興趣的朋友可以看一看下面的文章。
使用 StAX 解析 XML,第 1 部分: Streaming API for XML (StAX) 簡介
使用 StAX 解析 XML,第 2 部分: 拉式解析和事件
使用 StAX 解析 XML,第 3 部分: 使用定制事件和編寫 XML
參考推薦:
Android中解析XML數據
android解析XML總結(SAX、Pull、Dom三種方式)
Android 解析XML文件的三種方式 DOM,SAX,PULL
android解析xml文件的方式(推薦,共三篇)
Android 上使用 XML
Android 上使用 XML 和 JSON
Android 3.0 平臺上創建和解析 XML
Android XML解析學習——創建XML(共六篇,推薦)
再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!希望你也加入到我們人工智能的隊伍中來!http://www.captainbed.net
Android 創建與解析XML(一)—— 概述