最初,XML 語言只是意圖用來作為HTML 語言的替代品而出現的,但是隨著該語言的不斷發展和完善,人們越來越發現它所具有的優點:例如標記語言可擴展,嚴格的語法規定,可使用有意義的標記,內容儲存和表現分離等等優勢注定了該語言從誕生之日起就會走向輝煌。 XML 語言在成為W3C 標準之後進入到了一個快速發展的時期,當然它本身所具有的一系列優點和優勢也注定了各大技術廠商對它的偏愛,Java 作為軟體行業的一種開發技術也迅速作出了反應,出現了多種對XML 支援的工具,本文將會從這個角度對Java 處理XML 的幾種主流技術進行介紹,希望能對您有所幫助。
Java 有哪些優秀的類別庫及工具便於程式設計師對XML 進行處理?
XML 三種解析方式簡介大名鼎鼎的DOM
說它大名鼎鼎可是一點不為過,DOM 是W3C 處理XML 的標準API,它是許多其它與XML 處理相關的標準的基礎,不僅是Java,其它諸如Javascript,PHP,MS .NET 等等語言都實現了該標準, 成為了應用最廣泛的XML 處理方式。當然,為了能提供更多更強大的功能,Java 對於DOM 直接擴充工具類別有很多,例如許多Java 程式設計師耳熟能詳的JDOM,DOM4J 等等, 它們基本上屬於對DOM 介面功能的擴充,保留了許多DOM API 的特性,許多原本的DOM 程式設計師甚至沒有任何障礙就熟練了另外兩者的使用,直觀、易於操作的方式使它深受廣大Java 程式設計師的喜愛。
綠色環保的SAX
SAX 的應運而生有它特殊的需要,為什麼說它綠色環保呢,這是因為SAX 使用了最少的系統資源和最快速的解析方式對XML 處理提供了支持。 但隨之而來繁瑣的查找方式也給廣大程式設計師帶來許多困擾,常常令人頭痛不已,同時它對XPath 查詢功能的支持,令人們對它又愛又恨。
默默無聞的Digester:XML 的JavaBean 化
Digester 是apache 基金組織下的一個開源項目,筆者對它的了解源於對Struts 框架的研究,是否有很多程式設計師想要一解各大開源框架的設計甚至想要自己寫一個功能強大的框架時會碰到這樣一個難題: 這些形形色色的用XML 語言標記的框架配置文件,框架底層是用什麼技術來解析呢? DOM 解析耗費時間,SAX 解析又過於繁瑣,況且每次解析系統開銷也會過大, 於是,大家想到需要用與XML 結構相對應的JavaBean 來裝載這些信息,由此Digester 應運而生。它的出現為XML 轉換為JavaBean 物件的需求帶來了方便的操作接口,使得更多的類似需求得到了比較完美的解決方法, 不再需要程式設計師自己實現此類繁瑣的解析程序了。同時SUN 也推出了XML 和JavaBean 轉換工具類別JAXB,有興趣的讀者可以自行了解。
下面來看一個Java dom解析XML的範例:
import java.io.*; import org.w3c.dom.*; import org.xml.sax.SAXException; import javax.xml.parsers.*; public class Xml { public static void main(String[] args) { DocumentBuildery factory = DocumentBuilderFactory.newInstance(); try { DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(new File("E://work//test//xml1.xml")); NodeList nl = doc.getElementsByTagName("book"); for (int i = 0; i < nl.getLength(); i++) { System.out.println(nl.item(i).getAttributes().item(0)); System.out.println(doc.getElementsByTagName("title").item(i) .getFirstChild().getNodeValue() ); System.out.println(doc.getElementsByTagName("title").item(i) .getAttributes().item(0)); System.out.println(doc.getElementsByTagName("author").item(i) .getFirstChild().getNodeValue()); System.out.println(doc.getElementsByTagName( "year").item(i) .getFirstChild().getNodeValue()); System.out.println(doc.getElementsByTagName("price").item(i) .getFirstChild().getNodeValue()); System.out.println(); } } catch (ParserConfigurationException e) { e.printStackTrace() ; } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
xml:
<bookstore> <book category="COOKING"> <title lang="en">Everyday Italian</title> <author>Giada De Laurentiis</author> <year>2005</year> <price>30.00</price > </book> <book category="CHILDREN"> <title lang="en">Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> <book category="WEB"> <title lang="en">Learning XML</title> <author>Erik T. Ray< /author> <year>2003</year> <price>39.95</price> </book> </bookstore>
結果:
category="COOKING"Everyday Italianlang="en"Giada De Laurentiis200530.00category="CHILDREN"Harry Potterlang="en"J K. Rowling200529.99category="WEB"Learning XML Raylang="en"Erik T.20039.995