JDOM的介紹以及與JAXB的比較 Java + XML = JDOM ,! 這就是JDOM設(shè)計(jì)者的目標(biāo),。如果你曾經(jīng)使用過(guò)煩人的SAX或是DOM來(lái)處理XML,你就會(huì)知道為什么要有JDOM或者是JAXB,。在JavaOne會(huì)議上JDOM的主要?jiǎng)?chuàng)始人Jason Hunter有一篇精彩的演講介紹了JDOM技術(shù),,題目就是JDOM Makes XML Easy。 在那篇文檔里,JDOM被拿來(lái)與DOM比較,,而我更愿意拿它同JAXB比較,。因?yàn)镴AXB和JDOM都是為了在Java中提供比DOM和SAX更為方便的XML處理接口而開(kāi)發(fā)的,并且通過(guò)完全不同的途徑來(lái)解決這個(gè)問(wèn)題,。JDOM的處理方式是與DOM類(lèi)似的樹(shù)操作,。而JAXB通過(guò)DTD和綁定模式來(lái)生成訪問(wèn)XML文檔的Java代碼,將XML映射成了Java對(duì)象來(lái)操作,。你可以根據(jù)項(xiàng)目的需要和個(gè)人喜好來(lái)決定采用哪一個(gè),。 JDOM與JAXB的比較,從本身的特點(diǎn)來(lái)看: 1) JDOM比JAXB更容易上手,。使用JAXB首先要會(huì)編寫(xiě)DTD,,然后還要會(huì)編寫(xiě)綁定模式。JDOM沒(méi)有這樣的要求,,如果你會(huì)Java和XML,,甚至可以說(shuō)光是看JDOM的javadoc文檔就能夠使用JDOM。 2) JAXB編寫(xiě)好DTD和綁定模式以后,,XML文檔被映射成了Java對(duì)象,,其數(shù)據(jù)就是Java對(duì)象的屬性,連數(shù)據(jù)類(lèi)型都做好了轉(zhuǎn)換,,因此,,訪問(wèn)XML文檔比JDOM要簡(jiǎn)便,可以說(shuō)是一勞永逸,。 3) JAXB由某個(gè)DTD和綁定模式生成的代碼只能訪問(wèn)該DTD所約束的文檔,。如果想要訪問(wèn)其他XML文檔,需要再編寫(xiě)DTD和綁定模式,。JDOM可以處理任何XML文檔,,包括受約束的和不受約束的。 目前JDOM和JAXB都沒(méi)有正式版本,。JDOM的最新版本是beta8,,JAXB是1.0 early access,其規(guī)范版本是0.21,。相對(duì)而言,,JDOM更成熟一些。例如JAXB不支持名字空間,、不能向XML文檔寫(xiě)入處理指令,,有時(shí)我們需要保留的換行符和首尾空格在JAXB中自動(dòng)過(guò)濾掉了,就連放在里面也不能幸免,。JDOM就沒(méi)有這些限制,。如果說(shuō)以上的3點(diǎn)比較是JDOM和JAXB本身的特點(diǎn)所決定的,,幾乎不可能改變,那么這里表明,,JAXB還需要更多的工作,。 獲得并安裝JDOM 在http://可以下載JDOM的最新版本。以JDOM beta8的2進(jìn)制版本為例,。下載后解壓縮,,JDOM的jar文件就是build目錄下的文件jdom.jar,將之加入類(lèi)路徑,。另外JDOM還需要lib目錄下那些jar文件如xerces.jar的支持。如果在使用中出現(xiàn)以下錯(cuò)誤:
或
你需要保證xerces.jar文件在CLASSPATH中位于其他XML類(lèi),,如JAXP或Crimson之前,,這些類(lèi)文件,包括以前老版本的xerces,,可能不支持SAX2.0或DOM Level 2,。于是導(dǎo)致了上面的錯(cuò)誤。 一個(gè)簡(jiǎn)單的例子 JDOM的處理方式有些類(lèi)似于DOM,,但它主要是用SAX實(shí)現(xiàn)的,,你不必?fù)?dān)心處理速度和內(nèi)存的問(wèn)題。另外,,JDOM中幾乎沒(méi)有接口,,的類(lèi)全部是實(shí)實(shí)在在的類(lèi),沒(méi)有類(lèi)工廠類(lèi)的,。其最重要的一個(gè)包org.jdom中主要有以下類(lèi):
數(shù)據(jù)輸入要用到XML文檔要通過(guò)org.jdom.input包,,反過(guò)來(lái)需要org.jdom.output。如前面所說(shuō),,關(guān)是看API文檔就能夠使用,。 我們的例子讀入XML文件exampleA.xml,加入一條處理指令,,修改第一本書(shū)的價(jià)格和作者,,并添加一條屬性,然后寫(xiě)入文件exampleB.xml:
執(zhí)行結(jié)果exampleB.xml:
在默認(rèn)情況下,,JDOM的Element類(lèi)的getText()這類(lèi)的方法不會(huì)過(guò)濾空白字符,如果你需要過(guò)濾,,用setTextTrim() ,。 |
|