<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    歲月如哥
    人生非夢(mèng)
    posts - 50,comments - 144,trackbacks - 0

    作者:robbin (MSN:robbin_fan AT hotmail DOT com)

    在IBM的developerWorks上有兩篇非常優(yōu)秀的關(guān)于Java XML API的評(píng)測(cè)文章:

    Java中XML文檔模型的性能

    Java中XML文檔模型的用法

    對(duì)這兩篇文章我想說(shuō)的就是 吐血推薦

    Java的XML API這幾篇文章該講的都講到了,我只想補(bǔ)充幾點(diǎn):

    一、Crimson和Xerces恩仇錄
    Crimson來(lái)自于Sun捐贈(zèng)給Apache的ProjectX項(xiàng)目,Xerces來(lái)自IBM捐贈(zèng)給Apache的XML4J項(xiàng)目,結(jié)果Xerces勝出,成了Apache XML小組全力開(kāi)發(fā)的XML API,而Crimon已經(jīng)早就不做了,如今Xerces名滿天下,到處都是在用Xerces DOM和SAX解析器,只有Sun不服氣,非要在JDK1.4里面使用過(guò)時(shí)的Crimson,讓人感覺(jué)像是在賭氣一樣,真是讓人可憐又可氣!不過(guò)IBM發(fā)行JDK用的XML 解析器自然是Xerces。

    由于JDK的Class Loader的優(yōu)先級(jí)關(guān)系,當(dāng)你采用JAXP編寫(xiě)XML程序的時(shí)候,即使把Xerces包引入CLASSPATH,JDK還是會(huì)頑固的使用Crimson,這一點(diǎn)通過(guò)打開(kāi)JVM的verbose參數(shù)可以觀察到。不過(guò)JDK也允許你采用其它的解析器,因此我們可以通過(guò)在JRE\lib\目錄下建一個(gè)jaxp.properties的文件,來(lái)替換解析器,jaxp.properties內(nèi)容如下:

    javax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl

    javax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl

    這樣就可以使用Xerces,當(dāng)然你必須還是要把Xerces包放到CLASSPATH下。

    二、JAXP的姍姍來(lái)遲
    Sun在XML領(lǐng)域總是后知后覺(jué),等到Sun重視XML的時(shí)候,XML的API早就滿天 飛了,尤其是IBM具有非常大的領(lǐng)先優(yōu)勢(shì)。不過(guò)Sun是規(guī)范的制訂者,于是參考W3C的標(biāo)準(zhǔn)制訂了JAXP規(guī)范。JAXP不像Xerces和Crimon那樣,它只是一個(gè)spec,本身是不做任何事情的,它的作用就是提出一個(gè)統(tǒng)一的接口,讓其它的XML API都來(lái)遵循JAXP編程,那么用JAXP寫(xiě)出來(lái)的程序,底層的API可以任意切換。

    具體來(lái)說(shuō)JAXP包括了幾個(gè)工廠類(lèi),這就是JDK1.4里面的javax.xml.parsers 包,用來(lái)尋找符合DOM標(biāo)準(zhǔn)的XML API實(shí)現(xiàn)類(lèi)的位置;此外JAXP還包括一整套interface,這就是JDK1.4里面的org.w3c.dom那幾個(gè)包。工廠類(lèi)負(fù)責(zé)加載DOM的實(shí)現(xiàn)類(lèi)。那么加載的規(guī)則是什么呢?

    我是通過(guò)閱讀JAXP的源代碼知道的,工廠類(lèi)首先會(huì)根據(jù)java命令行傳入的參數(shù)進(jìn)行尋找,然后在根據(jù)JRE\lib\jaxp.properties中定義的實(shí)現(xiàn)類(lèi)尋找,最后什么都找不到的話,就用Crimson。注意Crimons是由Bootstrap Class Loader來(lái)load的,如果你不通過(guò)上面兩個(gè)方法來(lái)改變工廠的尋找順序,那么鐵定用Crimson了 :(

    三、DOM解析器和DOM API
    當(dāng)你嚴(yán)格采用JAXP編程的時(shí)候,是遵循W3C的DOm標(biāo)準(zhǔn)的,那么在JAXP底層你實(shí)際上可以任意切換不同的DOM實(shí)現(xiàn),例如Xerces,或者Crimon,再或者其它,切換方法就是配置jaxp.properties。因此JAXP就是一些標(biāo)準(zhǔn)接口而已。

    而Xerces和Crimon也不單單是一個(gè)DOM實(shí)現(xiàn)那么簡(jiǎn)單,他們本身實(shí)際上也包含SAX解析器和DOM解析器。所以一個(gè)JAXP程序下面有如下層次:

    JAXP應(yīng)用程序 -> JAXP接口 -> Xerces DOM實(shí)現(xiàn) -> Xerces DOM/SAX 解析器

    只要你用JAXP編程,那么你就可以切換到Crimson上來(lái)

    JAXP應(yīng)用程序 -> JAXP接口 -> Crimson DOM實(shí)現(xiàn) -> Crimson DOM/SAX 解析器

    另外你也可以這樣來(lái)做:

    JAXP應(yīng)用程序 -> JAXP接口 -> Crimson DOM實(shí)現(xiàn) -> Xerces DOM/SAX 解析器

    不過(guò)如果你的程序不安裝JAXP來(lái)寫(xiě),那么就沒(méi)有辦法切換不同的DOM實(shí)現(xiàn)了。

    四、不是標(biāo)準(zhǔn)的dom4j和jdom
    W3C的DOM標(biāo)準(zhǔn)API難用的讓人想撞墻,于是有一幫人開(kāi)發(fā)Java專(zhuān)用的XML API目的是為了便于使用,這就是jdom的由來(lái),開(kāi)發(fā)到一半的時(shí)候,另一部分人又分了出來(lái),他們有自己的想法,于是他們就去開(kāi)發(fā)dom4j,形成了今天這樣兩個(gè)API,至于他們之間的性能,功能之比較看看上面我推薦的文章就知道了,jdom全面慘敗。

    jdom 相當(dāng)于上面的 JAXP接口 + Xerces DOM實(shí)現(xiàn)部分,它本身沒(méi)有解析器,它可以使用Xerces或者Crimson的解析器,就是這樣:

    jdom應(yīng)用程序 -> jdom API -> Xerces/Crimson解析器

    dom4j 和jdom類(lèi)似,不過(guò)他自己綁定了一個(gè)叫做Alfred2的解析器,功能不是很全,但是速度很快,當(dāng)沒(méi)有其它的解析器的時(shí)候,dom4j將使用Alfred2解析器,如下:

    dom4j應(yīng)用程序 -> dom4j API ->  Xerces/Crimson解析器

    或者

    dom4j應(yīng)用程序 -> dom4j API ->  Alfred2解析器

    你在SF上下載的dom4j.jar是不含 Alfred2解析器的,而dom4j-full.jar包含了 Alfred2解析器,在這種情況下,實(shí)際上你什么也不需要,光是一個(gè)dom4j-full.jar就全部都包括了。

    因此可以看出采用dom4j/jdom編寫(xiě)的應(yīng)用程序,已經(jīng)不具備可移植性了。

    五、小插曲
    Sun是JAXP標(biāo)準(zhǔn)的制訂者,甚至很執(zhí)著的在JDK1.4里面綁定Crimson DOM實(shí)現(xiàn)和解析器,然后可笑的是,Sun自己的JAXM RI竟然不是用JAXP寫(xiě)出來(lái)的,而是dom4j,制訂標(biāo)準(zhǔn)讓大家遵守,自己卻監(jiān)守自盜,這未免太說(shuō)不過(guò)去了吧!

    BTW: Hibernate也用的是dom4j來(lái)讀取XML配置文件,如今已經(jīng)越來(lái)越多的程序紛紛采用dom4j,如果你不是那么在乎可移植性,我強(qiáng)烈建議你采用dom4j。


    本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/rosen/articles/154194.aspx

    posted on 2009-10-01 01:34 歲月如歌 閱讀(379) 評(píng)論(1)  編輯  收藏 所屬分類(lèi): java

    FeedBack:
    # re: Java XML API 漫談 zz
    2009-10-01 01:37 | 歲月如歌
    以上內(nèi)容需要更正的是,在jdk5.0之后,sun對(duì)jaxp的默認(rèn)實(shí)現(xiàn)也采用的是xerces,看來(lái)Crimson被永遠(yuǎn)拋棄了……這也意味著如果使用jaxp的話(主要為考慮可移植性)默認(rèn)就不需要再給項(xiàng)目引入xerces.jar相關(guān)的類(lèi)了。。
    當(dāng)然本文的建議是用dom4j進(jìn)行xml操作。。。  回復(fù)  更多評(píng)論
      
    主站蜘蛛池模板: 国产精品视频免费一区二区| 亚洲欧洲日产国码无码久久99| 香蕉视频亚洲一级| 日本亚洲国产一区二区三区| 日韩在线永久免费播放| 亚洲爆乳无码精品AAA片蜜桃| 亚洲中文字幕无码永久在线| 亚洲免费在线视频播放| 美女又黄又免费的视频| 亚洲国产香蕉碰碰人人| 在线观看永久免费视频网站| 午夜免费福利视频| 国产亚洲综合久久| 亚洲视频一区二区在线观看| 国产三级免费电影| 亚洲一区二区三区免费在线观看 | 成年丰满熟妇午夜免费视频| 暖暖免费中文在线日本| 亚洲春黄在线观看| 国产亚洲精品拍拍拍拍拍| 99精品全国免费观看视频| 国产一级高青免费| 色九月亚洲综合网| 亚洲免费观看网站| 亚洲精品无码高潮喷水在线| 免费国产在线观看不卡| 免费无码精品黄AV电影| 久久精品一区二区免费看| 免费看黄网站在线看| 亚洲精品国产第一综合99久久 | 亚洲国产精品成人久久久| 久久久久亚洲精品天堂久久久久久| 中文字幕影片免费在线观看| 免费av一区二区三区| eeuss在线兵区免费观看| 亚洲精品无码少妇30P| 亚洲精品福利网站| 久久精品视频亚洲| 亚洲综合熟女久久久30p| 免费在线看片网站| 国产又大又长又粗又硬的免费视频|