Java 處理 XML 的三種主流技術(shù)及介紹
XML (eXtensible Markup Language) 意為可擴(kuò)展標(biāo)記語(yǔ)言,它已經(jīng)是軟件開發(fā)行業(yè)中大多數(shù)程序員和廠商用以選擇作為數(shù)據(jù)傳輸?shù)妮d體。本文作者對(duì)于 Java 處理 XML 的幾種主流技術(shù)進(jìn)行一些總結(jié)和介紹,希望幫助那些有不同需求的開發(fā)人員對(duì)于 XML 處理技術(shù)的作出最優(yōu)的選擇。
最初,XML 語(yǔ)言僅僅是意圖用來(lái)作為 HTML 語(yǔ)言的替代品而出現(xiàn)的,但是隨著該語(yǔ)言的不斷發(fā)展和完善,人們?cè)絹?lái)越發(fā)現(xiàn)它所具有的優(yōu)點(diǎn):例如標(biāo)記語(yǔ)言可擴(kuò)展,嚴(yán)格的語(yǔ)法規(guī)定,可使用有意義的標(biāo)記,內(nèi)容 存儲(chǔ)和表現(xiàn)分離等等優(yōu)勢(shì)注定了該語(yǔ)言從誕生之日起就會(huì)走向輝煌。 XML 語(yǔ)言在成為 W3C 標(biāo)準(zhǔn)之后進(jìn)入到了一個(gè)快速發(fā)展的時(shí)期,當(dāng)然它本身所具有的一系列優(yōu)點(diǎn)和優(yōu)勢(shì)也注定了各大技術(shù)廠商對(duì)它的偏愛(ài),Java 作為軟件行業(yè)的一種開發(fā)技術(shù)也迅速作出了反應(yīng),出現(xiàn)了多種對(duì) XML 支持的工具,本文將會(huì)從這個(gè)角度對(duì) Java 處理 XML 的幾種主流技術(shù)進(jìn)行介紹,希望能對(duì)您有所幫助。在這篇文章中,您將會(huì)得到以下信息:
Java 提供了哪些優(yōu)秀的類庫(kù)及工具便于程序員對(duì) XML 進(jìn)行處理 ?
有了 DOM 了,其它工具類庫(kù)還有必要么 ?
幾個(gè)小例程帶你快速了解這三種解析方式
Java 有哪些優(yōu)秀的類庫(kù)及工具便于程序員對(duì) XML 進(jìn)行處理 ?
大名鼎鼎的 DOM
綠色環(huán)保的 SAX
默默無(wú)聞的 Digester
XML 三種解析方式簡(jiǎn)介
大名鼎鼎的 DOM
說(shuō)它大名鼎鼎可是一點(diǎn)不為過(guò),DOM 是 W3C 處理 XML 的標(biāo)準(zhǔn) API,它是許多其它與 XML 處理相關(guān)的標(biāo)準(zhǔn)的基礎(chǔ),不僅是 Java,其它諸如 Javascript,PHP,MS .NET 等等語(yǔ)言都實(shí)現(xiàn)了該標(biāo)準(zhǔn), 成為了應(yīng)用最為廣泛的 XML 處理方式。當(dāng)然,為了能提供更多更加強(qiáng)大的功能,Java 對(duì)于 DOM 直接擴(kuò)展工具類有很多,比如很多 Java 程序員耳熟能詳?shù)?JDOM,DOM4J 等等, 它們基本上屬于對(duì) DOM 接口功能的擴(kuò)充,保留了很多 DOM API 的特性,許多原本的 DOM 程序員甚至都沒(méi)有任何障礙就熟練掌握了另外兩者的使用,直觀、易于操作的方式使它深受廣大 Java 程序員的喜愛(ài)。
綠色環(huán)保的 SAX
SAX 的應(yīng)運(yùn)而生有它特殊的需要,為什么說(shuō)它綠色環(huán)保呢,這是因?yàn)?SAX 使用了最少的系統(tǒng)資源和最快速的解析方式對(duì) XML 處理提供了支持。 但隨之而來(lái)繁瑣的查找方式也給廣大程序員帶來(lái)許多困擾,常常令人頭痛不已,同時(shí)它對(duì) XPath 查詢功能的支持,令人們對(duì)它又愛(ài)又恨。
默默無(wú)聞的 Digester:XML 的 JavaBean 化
Digester 是 apache 基金組織下的一個(gè)開源項(xiàng)目,筆者對(duì)它的了解源于對(duì) Struts 框架的研究,是否有很多程序員想要一解各大開源框架的設(shè)計(jì)甚至想要自己寫一個(gè)功能強(qiáng)大的框架時(shí)會(huì)碰到這樣一個(gè)難題: 這些形形色色的用 XML 語(yǔ)言標(biāo)記的框架配置文件,框架底層是用什么技術(shù)來(lái)解析呢? DOM 解析耗費(fèi)時(shí)間,SAX 解析又過(guò)于繁瑣,況且每次解析系統(tǒng)開銷也會(huì)過(guò)大, 于是,大家想到需要用與 XML 結(jié)構(gòu)相對(duì)應(yīng)的 JavaBean 來(lái)裝載這些信息,由此 Digester 應(yīng)運(yùn)而生。它的出現(xiàn)為 XML 轉(zhuǎn)換為 JavaBean 對(duì)象的需求帶來(lái)了方便的操作接口,使得更多的類似需求得到了比較完美的解決方法, 不再需要程序員自己實(shí)現(xiàn)此類繁瑣的解析程序了。與此同時(shí) SUN 也推出了 XML 和 JavaBean 轉(zhuǎn)換工具類 JAXB,有興趣的讀者可以自行了解。
三種解析方式比較
DOM
優(yōu)缺點(diǎn):實(shí)現(xiàn) W3C 標(biāo)準(zhǔn),有多種編程語(yǔ)言支持這種解析方式,并且這種方法本身操作上簡(jiǎn)單快捷,十分易于初學(xué)者掌握。其處理方式是將 XML 整個(gè)作為類似樹結(jié)構(gòu)的方式讀入內(nèi)存中以便操作及解析,因此支持應(yīng)用程序?qū)?XML 數(shù)據(jù)的內(nèi)容和結(jié)構(gòu)進(jìn)行修改,但是同時(shí)由于其需要在處理開始時(shí)將整個(gè) XML 文件讀入到內(nèi)存中去進(jìn)行分析,因此其在解析大數(shù)據(jù)量的 XML 文件時(shí)會(huì)遇到類似于內(nèi)存泄露以及程序崩潰的風(fēng)險(xiǎn),請(qǐng)對(duì)這點(diǎn)多加注意。
適用范圍:小型 XML 文件解析、需要全解析或者大部分解析 XML、需要修改 XML 樹內(nèi)容以生成自己的對(duì)象模型
SAX
SAX 從根本上解決了 DOM 在解析 XML 文檔時(shí)產(chǎn)生的占用大量資源的問(wèn)題。其實(shí)現(xiàn)是通過(guò)類似于流解析的技術(shù),通讀整個(gè) XML 文檔樹,通過(guò)事件處理器來(lái)響應(yīng)程序員對(duì)于 XML 數(shù)據(jù)解析的需求。由于其不需要將整個(gè) XML 文檔讀入內(nèi)存當(dāng)中,它對(duì)系統(tǒng)資源的節(jié)省是十分顯而易見(jiàn)的,它在一些需要處理大型 XML 文檔以及性能要求較高的場(chǎng)合有起了十分重要的作用。支持 XPath 查詢的 SAX 使得開發(fā)人員更加靈活,處理起 XML 來(lái)更加的得心應(yīng)手。但是同時(shí),其仍然有一些不足之處也困擾廣大的開發(fā)人員:首先是它十分復(fù)雜的 API 接口令人望而生畏,其次由于其是屬于類似流解析的文件掃描方式,因此不支持應(yīng)用程序?qū)τ?XML 樹內(nèi)容結(jié)構(gòu)等的修改,可能會(huì)有不便之處。
適用范圍:大型 XML 文件解析、只需要部分解析或者只想取得部分 XML 樹內(nèi)容、有 XPath 查詢需求、有自己生成特定 XML 樹對(duì)象模型的需求
Digester/JAXB
優(yōu)缺點(diǎn) : 由于其是在上述兩者的基礎(chǔ)上衍生出來(lái)的工具類,為的是滿足將 XML 轉(zhuǎn)換為 JavaBean 的特殊需求,故而沒(méi)有什么特別明顯的優(yōu)缺點(diǎn)。作為大名鼎鼎的開源框架 Struts 的 XML 解析工具 Digester,為我們帶來(lái)了將 XML 轉(zhuǎn)換為 JavaBean 的可靠方法。
適用范圍:有將 XML 文檔直接轉(zhuǎn)換為 JavaBean 需求。
應(yīng)用示例請(qǐng)見(jiàn)第二頁(yè)
下面給出一段用于解析的 XML 片段:
|
DOM 解析 XML
Java 中的 DOM 接口簡(jiǎn)介: JDK 中的 DOM API 遵循 W3C DOM 規(guī)范,其中 org.w3c.dom 包提供了 Document、DocumentType、Node、NodeList、Element 等接口, 這些接口均是訪問(wèn) DOM 文檔所必須的。我們可以利用這些接口創(chuàng)建、遍歷、修改 DOM 文檔。
javax.xml.parsers 包中的 DoumentBuilder 和 DocumentBuilderFactory 用于解析 XML 文檔生成對(duì)應(yīng)的 DOM Document 對(duì)象。
javax.xml.transform.dom 和 javax.xml.transform.stream 包中 DOMSource 類和 StreamSource 類,用于將更新后的 DOM 文檔寫入 XML 文件。
下面給出一個(gè)運(yùn)用 DOM 解析 XML 的例子:
|
下面給出一段用于解析的 XML 片段:
|
DOM 解析 XML
Java 中的 DOM 接口簡(jiǎn)介: JDK 中的 DOM API 遵循 W3C DOM 規(guī)范,其中 org.w3c.dom 包提供了 Document、DocumentType、Node、NodeList、Element 等接口, 這些接口均是訪問(wèn) DOM 文檔所必須的。我們可以利用這些接口創(chuàng)建、遍歷、修改 DOM 文檔。
javax.xml.parsers 包中的 DoumentBuilder 和 DocumentBuilderFactory 用于解析 XML 文檔生成對(duì)應(yīng)的 DOM Document 對(duì)象。
javax.xml.transform.dom 和 javax.xml.transform.stream 包中 DOMSource 類和 StreamSource 類,用于將更新后的 DOM 文檔寫入 XML 文件。
下面給出一個(gè)運(yùn)用 DOM 解析 XML 的例子:
|
在上面的例子中,DOMParser 的 Parse() 方法負(fù)責(zé)解析 XML 文件并生成對(duì)應(yīng)的 DOM Document 對(duì)象。其中 DocumentBuilderFactory 用于生成 DOM 文檔解析器以便解析 XML 文檔。 在獲取了 XML 文件對(duì)應(yīng)的 Document 對(duì)象之后,我們可以調(diào)用一系列的 API 方便的對(duì)文檔對(duì)象模型中的元素進(jìn)行訪問(wèn)和處理。 需要注意的是調(diào)用 Element 對(duì)象的 getChildNodes() 方法時(shí)將返回其下所有的子節(jié)點(diǎn),其中包括空白節(jié)點(diǎn),因此需要在處理子 Element 之前對(duì)節(jié)點(diǎn)類型加以判斷。
可以看出 DOM 解析 XML 易于開發(fā),只需要通過(guò)解析器建立起 XML 對(duì)應(yīng)的 DOM 樹型結(jié)構(gòu)后便可以方便的使用 API 對(duì)節(jié)點(diǎn)進(jìn)行訪問(wèn)和處理,支持節(jié)點(diǎn)的刪除和修改等。 但是 DOM 解析 XML 文件時(shí)會(huì)將整個(gè) XML 文件的內(nèi)容解析成樹型結(jié)構(gòu)存放在內(nèi)存中,因此不適合用 DOM 解析很大的 XML 文件。
SAX 解析 XML
與 DOM 建立樹形結(jié)構(gòu)的方式不同,SAX 采用事件模型來(lái)解析 XML 文檔,是解析 XML 文檔的一種更快速、更輕量的方法。 利用 SAX 可以對(duì) XML 文檔進(jìn)行有選擇的解析和訪問(wèn),而不必像 DOM 那樣加載整個(gè)文檔,因此它對(duì)內(nèi)存的要求較低。 但 SAX 對(duì) XML 文檔的解析為一次性讀取,不創(chuàng)建任何文檔對(duì)象,很難同時(shí)訪問(wèn)文檔中的多處數(shù)據(jù)。
下面是一個(gè) SAX 解析 XML 的例子:
|
posted on 2012-08-16 10:35 順其自然EVO 閱讀(185) 評(píng)論(0) 編輯 收藏