陳小毛 湯文兵
摘要:XML應(yīng)用日益廣泛,正確高效地解析XML文件的數(shù)據(jù)信息日顯重要。Java解析XML的方法有多種,主流方法有DOM、SAX、JDOM、DOM4J。本文分析了這些方法的優(yōu)劣,給出了最基本的解析XML的示例Java程序。在實(shí)際應(yīng)用中,可以根據(jù)各種解析方法的特點(diǎn)選擇。
關(guān)鍵詞:JAVA;XML;DOM;SAX;JDOM;DOM4J
1 引言
隨著Web的廣泛應(yīng)用,XML已成為互聯(lián)網(wǎng)上主要數(shù)據(jù)交換標(biāo)準(zhǔn)之一,正確高效地解析XML文件的數(shù)據(jù)信息日顯重要。在Java中主要有四種解析XML的方法:DOM、SAX、JDOM和DOM4J,它們各有特點(diǎn)。通過比較,可以在應(yīng)用中更加合理地選擇它們。
2 DOM解析XML文檔
DOM(文檔對象模型)是W3C制定的一套標(biāo)準(zhǔn)接口,獨(dú)立于語言平臺的,提供了構(gòu)成DOM的不同對象的定義,卻沒有提供特定的實(shí)現(xiàn)[1]。實(shí)際上,任何編程語言都能夠?qū)崿F(xiàn),而不僅限于Java。DOM是以層次結(jié)構(gòu)組織的節(jié)點(diǎn)或信息片斷的集合。這個層次結(jié)構(gòu)允許開發(fā)人員在樹中尋找特定信息。分析該結(jié)構(gòu)通常需要加載整個文檔和構(gòu)造層次結(jié)構(gòu),然后才能做任何工作。由于它是基于信息層次的,因而DOM被認(rèn)為是基于樹或基于對象的。DOM以及廣義的基于樹的處理具有幾個優(yōu)點(diǎn)。首先,由于樹在內(nèi)存中是持久的,因此可以修改它以便應(yīng)用程序能對數(shù)據(jù)和結(jié)構(gòu)作出更改。其次,它還可以在任何時(shí)候在樹中上下導(dǎo)航,而不是像SAX那樣是一次性的處理。
2.1 DOM 設(shè)計(jì)的局限性
語言獨(dú)立。DOM 并不是用人們心目中的 Java 語言設(shè)計(jì)的。雖然這種方法保留了在不同語言中非常相似的API,它也使那些習(xí)慣 Java 語言的程序員感到更麻煩。例如:Java 語言內(nèi)建了一種 String 類,而 DOM 則規(guī)范定義了自己的 Text 類。
嚴(yán)格的層次結(jié)構(gòu)。DOM API 直接沿襲了 XML 規(guī)范。在 XML 中,每件東西都是一個結(jié)點(diǎn),因此能在 DOM 中找到一個幾乎每件東西都可以擴(kuò)展的基于 Node 的接口和返回 Node 的一系列方法。就多態(tài)性的觀點(diǎn)來講,它是優(yōu)秀的,但鑒于如上解釋,它在 Java 語言中的應(yīng)用是困難而且不便的,其中從 Node 向葉類型作顯式下拉會導(dǎo)致代碼的冗長和難以理解。
接口驅(qū)動。公共 DOM API 僅由接口組成(Exception 類是個例外)。W3C對提供實(shí)現(xiàn)并不感興趣,它只對定義接口感興趣。但它也意味著作為 Java 程序員使用 API 在創(chuàng)建 XML 對象時(shí)增加了分散程度,因?yàn)閃3C標(biāo)準(zhǔn)大量使用工廠化的類和類似的靈活的但不直接的模式。在某些應(yīng)用中,XML文檔是僅由語法分析器建立的,而從不會由應(yīng)用程序級代碼建立,這是不相關(guān)的。但隨著 XML 更廣泛的使用,并不是所有問題都繼續(xù)需要由語法分析器來驅(qū)動。應(yīng)用程序的開發(fā)人員需要一個更方便的方法有計(jì)劃地構(gòu)造 XML 對象。
2.2 DOM解析XML示例
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new File("sample.xml"));
3 SAX解析XML文檔
SAX(XML簡單應(yīng)用程序接口)是一個公共的基于事件的XML文檔解析標(biāo)準(zhǔn)[2]。SAX提供了一種對XML文檔進(jìn)行順序訪問的模式,這是一種快速讀寫XML數(shù)據(jù)的方式。當(dāng)使用SAX解析器對XML文檔進(jìn)行解析時(shí),會觸發(fā)一系列的事件,并激活相應(yīng)的事件處理函數(shù),從而完成對XML文檔的訪問,所以SAX接口也被稱作事件驅(qū)動接口。
與DOM比較而言,SAX是一種輕量型的方法。在處理DOM的時(shí)候,需要讀入整個XML文檔,再在內(nèi)存中創(chuàng)建DOM樹,生成DOM樹上的每個Node對象。當(dāng)文檔比較小的時(shí)候,這不會造成什么問題,但是一旦文檔大起來,處理DOM就會變得相當(dāng)費(fèi)時(shí)費(fèi)力。特別是其對于內(nèi)存的需求,也將是成倍的增長,以至于在某些應(yīng)用中使用DOM是一件很不劃算的事(如在Applet中)。這時(shí)候,一個較好的替代解決方法就是SAX。
SAX解析XML示例
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
XMLReader reader = parser.getXMLReader();
reader.setContentHandler(defaultHandle);
reader.parse(new InputSource(new FileReader("sample.xml")));
其中,defaultHandle就是實(shí)現(xiàn)了ContentHandler事件處理接口類的一個對象。
4 JDOM解析XML文檔
JDOM是一種使用 XML 的獨(dú)特 Java 工具包,用于快速開發(fā) XML 應(yīng)用程序。它的設(shè)計(jì)包含 Java 語言的語法乃至語義。JDOM的目的是成為Java特定的文檔模型。它簡化與XML的交互,并且比使用DOM實(shí)現(xiàn)更快。由于它遵循Pareto 法則,大大簡化了API[3]。
JDOM 自身不包含解析器。它通常使用 SAX2 解析器來解析和驗(yàn)證輸入 XML 文檔。它包含一些轉(zhuǎn)換器以將 JDOM 表示輸出成 SAX2 事件流、DOM 模型或 XML 文本文檔。
JDOM 與 DOM 主要有兩方面不同。首先,JDOM 僅使用具體類而不使用接口,這在某些方面簡化了 API,但也限制了靈活性。其次,API 大量使用了集合類,簡化了那些已經(jīng)熟悉這些類的 Java 開發(fā)者的使用。
JDOM解析XML示例
JDOM可以基于DOM或SAX方式解析XML,代碼如下:
DOMBuilder builder = new DOMBuilder();
Document doc = builder.build(new File("jdom.xml"));或
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(url);
5 DOM4J解析XML文檔
雖然DOM4J代表了完全獨(dú)立的開發(fā)結(jié)果,但最初它是 JDOM 的一種智能分支。它合并了許多超出基本 XML 文檔表示的功能,包括集成的 XPath 支持、XML Schema 支持以及用于大文檔或流化文檔的基于事件的處理[4]。它還提供了構(gòu)建文檔表示的選項(xiàng),它通過DOM4J API 和標(biāo)準(zhǔn) DOM 接口,具有并行訪問功能。
為支持這些功能,DOM4J使用接口和抽象基本類方法。DOM4J大量使用了API中的集合類,但是在許多情況下,它還提供一些替代方法以允許更好的性能或更直接的編碼方法。直接好處是它提供了比JDOM大得多的靈活性。
在添加靈活性、XPath集成和對大文檔處理的目標(biāo)時(shí),DOM4J的目標(biāo)與JDOM是一樣的:針對Java開發(fā)者的易用性和直觀操作。它還致力于成為比 JDOM更完整的解決方案,實(shí)現(xiàn)在本質(zhì)上處理所有Java/XML問題的目標(biāo)。在完成該目標(biāo)時(shí),它比JDOM更少強(qiáng)調(diào)防止不正確的應(yīng)用程序行為。
DOM4J是一個非常優(yōu)秀的Java XML API,具有性能優(yōu)異、功能強(qiáng)大和易用的特點(diǎn),同時(shí)也是一個開放源代碼的軟件。如今你可以看到越來越多的Java軟件都在使用DOM4J來讀寫 XML,特別值得一提的是連Sun的JAXM也在用DOM4J。
DOM4J解析XML示例
DOM4J也可以用DOM或SAX方式解析XML,示例代碼如下:
SAXReader reader = new SAXReader();
Document doc = reader.read(xmlFile);或
DocumentBuilderFactory factory = DocumentBuilderFactory.newDocumentBuilder();
DocumentBuilder builder = factory.newDocumentBuilder();
org.w3c.dom.Document document = builder.parse(xmlFile);
DOMReader reader = new DOMReader();
org.dom4j.Document doc = reader.read(document);
6 結(jié)束語
DOM和SAX解析方法具有通用性,但并不是特別為Java語言設(shè)計(jì)的。DOM一次性將XML文件完全讀入內(nèi)存,適用于小體積的XML文件。SAX則基于事件,對于體積較大的XML更能體現(xiàn)出優(yōu)越性。
JDOM與DOM4J都是為Java特別設(shè)計(jì)的,基于DOM或SAX。JDOM簡化了API,對于常用的XML處理相當(dāng)簡潔。DOM4J十分靈活,適用于工具或框架創(chuàng)建者等。
在實(shí)際應(yīng)用中,可以靈活地選擇其中一種,或幾種方法組合起來使用,以發(fā)揮各種方法的優(yōu)點(diǎn)。
參考文獻(xiàn)
[1]張銀鶴,冉小,劉制國等.JSP完全自學(xué)手冊[M].北京:清華大學(xué)出版社,2008
[2]張迪,朱敏,張凌立.基于SAX的XML解析與應(yīng)用[J].計(jì)算機(jī)與數(shù)字工程,2008,第7期:103~106
[3]用JDOM簡化XML編程. http://www.ibm.com/developerworks/cn/java/j-jdom/
[4] DOM4J. http://www.dom4j.org/
作者簡介:陳小毛(1983-),女,碩士研究生,研究方向:計(jì)算機(jī)控制。
湯文兵(1967-),男,副教授,碩士研究生導(dǎo)師,研究方向:計(jì)算機(jī)控制。