Posted on 2005-04-11 12:36
大阿福 閱讀(203)
評論(0) 編輯 收藏
JAXP是sun提出的一個規(guī)范,用于定義如何解析和轉(zhuǎn)換xml文檔的接口,目前版本已經(jīng)達到1.3,根據(jù)解析轉(zhuǎn)換供應(yīng)商無關(guān)性,解析器和轉(zhuǎn)換器可以在具體運行時進行多樣更換。這本身對于應(yīng)用開發(fā)來說是一個福音。
但是目前jaxp在國內(nèi)的使用并不是想象中那樣的廣泛,這也是由于一定的市場原因存在(對于不同版本的jvm的支持的需求)。
現(xiàn)在更多的應(yīng)用采用dom4j和jdom,其操作接口更為簡便。
個人以為,dom4j(不太了解jdom)并不是嚴(yán)格意義上的xml解析器,其底層也是采用符合jaxp規(guī)范的具體實現(xiàn),并且dom4j的文檔中表明,可以和jaxp協(xié)同工作,采用jaxp已經(jīng)config好的解析器和轉(zhuǎn)換器。
在dom4j最新發(fā)布版本1.5.2中,由于許可證的問題,內(nèi)部去除了解析器Aelfred2的實現(xiàn),這下是否更應(yīng)該依賴于底層的crimson.jar or xerces.jar,而二者是遵循jaxp規(guī)范的。
具體知識還在研究中。
對此與www.JavaGarden.net的一段討論:
.--------------------------------------------------------------------.
| Session Start: 2005年4月6日 |
| Participants: |
| (sn)大阿福 (toafu@msn.com) |
| .... 4月18日,愛因斯坦50周年祭日(ip)www.JavaGarden.net (turbochen@163.com) |
.--------------------------------------------------------------------.
[16:39:28] (sn)大阿福:
http://blog.csdn.net/toafu/archive/2005/04/06/338337.aspx
[16:39:34] (sn)大阿福: 我理解的對嗎?
[16:41:57] Turbo, A bea: good
[16:42:52] (sn)大阿福:
可是我怎么找不到我直接使用dom4j的時候,它是怎樣于jaxp發(fā)生關(guān)聯(lián)的。當(dāng)類路徑里面有二者的時候。
[16:46:18] Turbo, A bea: jaxp不是有幾個factory嗎,就是從這入手的.
[16:47:06] (sn)大阿福: 可是我沒有看到dom4j對這幾個factory有什么實現(xiàn)?
[16:48:24] Turbo, A bea: 我記得在一個什么文章上看到過, 好像是從factory上入手, 傳入一個class之類的.
具體用什么方法還得去查查.
[16:49:08] (sn)大阿福: 就是跟dom4j發(fā)生關(guān)聯(lián)的?
[16:49:41] Turbo, A bea: 你應(yīng)該還記得jdbc的驅(qū)動是怎么加載的, 跟那個原理類似.
[16:50:37] (sn)大阿福: 按順序找?guī)讉€路徑下是否有可加載的類
[16:51:23] Turbo, A bea: 不是, 是DriverManager.forName("classname");
類似這樣的方式.
[16:51:32] (sn)大阿福: 對
[16:53:52] (sn)大阿福:
是不是這樣理解,dom4j是不遵從jaxp規(guī)范的實現(xiàn),同樣底層是那些遵從了jaxp規(guī)范的xml解析器,只是因為dom4
j提供了很簡便的接口而應(yīng)用廣泛
[16:55:49] Turbo, A bea: 我覺得是dom4j遵從了jaxp規(guī)范, 并加以擴展, 使API更容易使用.
我沒有實際用過dom4j, 但知道它比jaxp的dom api好用很多.
我之前開發(fā)全用是jaxp 的 dom api, 取一個元素代碼很啰嗦.
[16:56:40] Turbo, A bea: 而jdom才是切頭切尾的沒遵從jaxp規(guī)范
[16:56:52] Turbo, A bea: 不易移植.
[16:57:14] (sn)大阿福:
好。我想知道的是,如果dom4j和jaxp的api都在classpath下時,如果能夠?qū)崿F(xiàn)直接操作jaxp接口而保證底
層用dom4j實現(xiàn)的呢?
[17:00:08] Turbo, A bea: How does dom4j relate to DOM?
DOM is a quite large language independent API. dom4j is a
simpler, lightweight API which is optimised for the Java
making extensive use of the Java 2 platform such as the
Java 2 collections.
Though dom4j fully supports the DOM standard allowing both
APIs to be used easily together.
[17:00:19] Turbo, A bea: 上面這段是dom4j的FAQ的內(nèi)容
[17:00:57] Turbo, A bea: dom4j fully supports the DOM standard
allowing both APIs to be used easily together.
[17:01:07] Turbo, A bea: 上面這句最關(guān)鍵
[17:01:52] (sn)大阿福: 不太明白什么意思
[17:02:28] (sn)大阿福: both是指?
[17:02:49] Turbo, A bea: 應(yīng)該是指dom4j和dom
[17:03:05] Turbo, A bea: together證明了這點
[17:03:10] (sn)大阿福: 哦?
[17:04:53] Turbo, A bea: 再看這一句: Dom4j works with any SAX parser via
JAXP.
[17:05:37] (sn)大阿福: 呵呵,我就想知道它是如何work with的,或者咱們在代碼里寫的時候如何融合dom4j和jaxp
[17:05:40] Turbo, A bea: 這就意味者,只要是符合jaxp規(guī)范的sax parser, 都可以作為dom4j的sax
parser使用.
[17:07:00] (sn)大阿福: 你這句沒錯
[17:08:04] (sn)大阿福: 那就是說dom4j和jaxp是并列的,只是dom4j不是規(guī)范而已,是嗎
[17:08:58] Turbo, A bea: 我覺得jaxp是規(guī)范,而dom4j是規(guī)范的擴展.
[17:09:35] (sn)大阿福: 而xerces等是規(guī)范的實現(xiàn)
[17:09:55] Turbo, A bea: 是啊
[17:10:21] (sn)大阿福: 是不是jaxp還未直接支持xpath,所以易用性不如dom4j
[17:10:35] Turbo, A bea: 其實, jaxp最初的實現(xiàn)是由apache捐現(xiàn)的,
[17:10:47] (sn)大阿福: 所以xml解析器就是apache的
[17:10:59] Turbo, A bea: 還未完全實現(xiàn)xpath, 不知java5實現(xiàn)的如何了.
[17:11:10] Turbo, A bea: 是啊
[17:11:29] (sn)大阿福: 新的1.3支持java5,呵呵
[17:11:36] (sn)大阿福: 好,多謝指教
[17:13:40] Turbo, A bea:
http://www.pconline.com.cn/pcedu/empolder/wz/xml/0412/50976
2_1.html
[17:13:52] Turbo, A bea: 這個文章可以一看,但不可全信.
[17:14:04] (sn)大阿福: OK,3ks
[17:17:50] Turbo, A bea:
http://www.54bk.com/more.asp?name=captain&id=1887
這個文章就可以看明白它們的關(guān)系了
[17:19:36] (sn)大阿福: dom4j應(yīng)用程序 -> dom4j API -> Xerces/Crimson解析器
dom4j應(yīng)用程序 -> dom4j API -> Alfred2解析器
[17:20:01] (sn)大阿福: dom4j默認(rèn)都是用第一行的解析器吧
[17:20:09] Turbo, A bea: apache的Xerces/Crimson解析器是核心,
[17:20:15] (sn)大阿福: 嗯
[17:20:24] Turbo, A bea: 其它類型的api都是用這些解析器.
[17:20:34] (sn)大阿福: Alfred2已經(jīng)在dom4j
[17:20:44] (sn)大阿福: 1.5.2中remove掉了
[17:20:56] Turbo, A bea: 是的
[17:22:12] (sn)大阿福:
所以jaxp和dom4j之間并沒有規(guī)范和實現(xiàn)的關(guān)系,而dom4j使用實現(xiàn)了jaxp規(guī)范的apache的解析器來解析xm
l文檔。
[17:22:24] (sn)大阿福: 感覺輪廓漸漸清晰了
[17:22:36] Turbo, A bea: 而jaxp定義的接口,包括dom和sax接口.
[17:22:54] Turbo, A bea: 然后jaxp也有自己的dom和sax實現(xiàn).
[17:23:16] (sn)大阿福: 那就是jaxp RI
[17:24:07] (sn)大阿福: 是sun做的。sun定義了jaxp規(guī)范,完了又實現(xiàn)了自己的一套api,解析器同樣用apache的
[17:24:45] (sn)大阿福: dom4j是未遵從jaxp規(guī)范實現(xiàn)了一套更易用的api,解析器也是用apache的
[17:25:42] (sn)大阿福:
dom4j文檔中描述:當(dāng)jaxp的jar在類路徑中是,dom4j使用的解析器會依據(jù)jaxp配置中的進行選擇。
[17:27:09] Turbo, A bea: 所以'work with jaxp'的意思是指符合jaxp 規(guī)范的parser.
[17:28:09] (sn)大阿福: 對,work with xml parsers obeying jaxp