3.8 Java與XML聯(lián)合編程之DOM篇
DOM是Document Object Model的縮寫,即文檔對(duì)象模型。前面說(shuō)過(guò),XML將數(shù)據(jù)組織為一顆樹,所以DOM就是對(duì)這顆樹的一個(gè)對(duì)象描敘。通俗的說(shuō),就是通過(guò)解析XML文檔,為XML文檔在邏輯上建立一個(gè)樹模型,樹的節(jié)點(diǎn)是一個(gè)個(gè)對(duì)象。我們通過(guò)存取這些對(duì)象就能夠存取XML文檔的內(nèi)容。
下面我們來(lái)看一個(gè)簡(jiǎn)單的例子,看看在DOM中,我們是如何來(lái)操作一個(gè)XML文檔的。
這是一個(gè)XML文檔,也是我們要操作的對(duì)象:
Good-bye serialization, hello Java!
下面,我們需要把這個(gè)文檔的內(nèi)容解析到一個(gè)個(gè)的Java對(duì)象中去供程序使用,利用JAXP,我們只需幾行代碼就能做到這一點(diǎn)。首先,我們需要建立一個(gè)解析器工廠,以利用這個(gè)工廠來(lái)獲得一個(gè)具體的解析器對(duì)象:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
我們?cè)谶@里使用DocumentBuilderFacotry的目的是為了創(chuàng)建與具體解析器無(wú)關(guān)的程序,當(dāng)DocumentBuilderFactory類的靜態(tài)方法newInstance()被調(diào)用時(shí),它根據(jù)一個(gè)系統(tǒng)變量來(lái)決定具體使用哪一個(gè)解析器。又因?yàn)樗械慕馕銎鞫挤䦶挠贘AXP所定義的接口,所以無(wú)論具體使用哪一個(gè)解析器,代碼都是一樣的。所以當(dāng)在不同的解析器之間進(jìn)行切換時(shí),只需要更改系統(tǒng)變量的值,而不用更改任何代碼。這就是工廠所帶來(lái)的好處。這個(gè)工廠模式的具體實(shí)現(xiàn),可以參看下面的類圖。
DocumentBuilder db = dbf.newDocumentBuilder();
當(dāng)獲得一個(gè)工廠對(duì)象后,使用它的靜態(tài)方法newDocumentBuilder()方法可以獲得一個(gè)DocumentBuilder對(duì)象,這個(gè)對(duì)象代表了具體的DOM解析器。但具體是哪一種解析器,微軟的或者IBM的,對(duì)于程序而言并不重要。
然后,我們就可以利用這個(gè)解析器來(lái)對(duì)XML文檔進(jìn)行解析了:
Document doc = db.parse("c:/xml/message.xml");
DocumentBuilder的parse()方法接受一個(gè)XML文檔名作為輸入?yún)?shù),返回一個(gè)Document對(duì)象,這個(gè)Document對(duì)象就代表了一個(gè)XML文檔的樹模型。以后所有的對(duì)XML文檔的操作,都與解析器無(wú)關(guān),直接在這個(gè)Document對(duì)象上進(jìn)行操作就可以了。而具體對(duì)Document操作的方法,就是由DOM所定義的了。
Jaxp支持W3C所推薦的DOM 2。如果你對(duì)DOM很熟悉,那么下面的內(nèi)容就很簡(jiǎn)單了:只需要按照DOM的規(guī)范來(lái)進(jìn)行方法調(diào)用就可以。當(dāng)然,如果你對(duì)DOM不清楚,也不用著急,后面我們會(huì)有詳細(xì)的介紹。在這兒,你所要知道并牢記的是:DOM是用來(lái)描敘XML文檔中的數(shù)據(jù)的模型,引入DOM的全部原因就是為了用這個(gè)模型來(lái)操作XML文檔的中的數(shù)據(jù)。DOM規(guī)范中定義有節(jié)點(diǎn)(即對(duì)象)、屬性和方法,我們通過(guò)這些節(jié)點(diǎn)的存取來(lái)存取XML的數(shù)據(jù)。
相關(guān)推薦:計(jì)算機(jī)等級(jí)考試二級(jí)Java經(jīng)典算法大全匯總
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |