Java中對(duì)于XML的API
發(fā)表時(shí)間:2024-01-21 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]簡(jiǎn)單介紹一下Java關(guān)于xml的API,這樣大家看到了縮寫(xiě)就知道是干什么的了。水平有限,多多包涵。 1、JAXP(Java API for XML Parsing) 2、JAXB(Java API for XML Binding) 3、JAXM(Java API for XML ...
簡(jiǎn)單介紹一下Java關(guān)于xml的API,這樣大家看到了縮寫(xiě)就知道是干什么的了。水平有限,多多包涵。
1、JAXP(Java API for XML Parsing)
2、JAXB(Java API for XML Binding)
3、JAXM(Java API for XML Messaging)
4、JAX-RPC(Java API for XML-RPC)
1、JAXP定義了在Java中使用DOM, SAX, XSLT的通用的接口。這樣在你的程序中你只要使用這些通用的接口,當(dāng)你需要改變具體的實(shí)現(xiàn)時(shí)候也不需要修改代碼。比如,你用的XSLT處理器太慢了,你想換一個(gè),你不需要修改你以前的代碼,只要修改一下JAXP的相關(guān)配置。(在后面我將詳細(xì)地介紹)作為一個(gè)共同的接口,JAXP也有所謂的“最小公分母”效應(yīng),也就是說(shuō)它支持的東西很有限。JAXP1.0支持XML1.0,XML Namespace1.0,SAX1.0以及DOM level 1。而JAXP1.1增加了對(duì)SAX2.0,DOM level 2以及XSLT1.0的支持。很明顯如果你想使用Xalan的XPath相關(guān)的接口,JAXP就沒(méi)有支持,你也只能將代碼綁定到特定的Xalan的API上了。
這里還要提一下JDOM,雖然它沒(méi)有實(shí)現(xiàn)JAXP,但是由于它使用的簡(jiǎn)單性,還是很受歡迎,并且成為了JCP正式推薦的API。它也是一種樹(shù)狀的結(jié)構(gòu)表現(xiàn)XML,在使用方法上要比w3c的dom標(biāo)準(zhǔn)簡(jiǎn)單易用的多。最新版本的JDOM在其內(nèi)部已經(jīng)開(kāi)始使用JAXP的API,它會(huì)盡可能的去調(diào)用JAXP的API,如果不行就使用自己的默認(rèn)XML解析器Xerces,XSLT處理器Xalan。
2、JAXB定義了Java數(shù)據(jù)對(duì)象和xml結(jié)構(gòu)之間的一種雙向映射關(guān)系。這樣你就可以很方便地將一個(gè)Java對(duì)象存儲(chǔ)為一個(gè)xml文檔,也可以從一個(gè)xml文檔實(shí)例化一個(gè)Java對(duì)象。它的結(jié)構(gòu)是這樣子的:首先要有xml的dtd以及binding schema(這個(gè)不是xml的schema,而是一個(gè)定義Java對(duì)象和xml結(jié)構(gòu)之間映射關(guān)系xml文檔),通過(guò)這兩個(gè)文件JAXB就可以生成與xml文檔結(jié)構(gòu)一致的Java源文件,編譯之后就可以很方便地通過(guò)具體的xml文檔得到與xml結(jié)構(gòu)一致的Java類(lèi)(就是生成的那些類(lèi))unmarshalling,反過(guò)來(lái)marshalling也可以。
它的缺點(diǎn)也很明顯,一旦xml的結(jié)構(gòu)發(fā)生了改變,就要重新寫(xiě)bindng schema以及重新生成編譯Java類(lèi)。
sun的動(dòng)作總是一如既往地慢,在JAXB出臺(tái)之前已經(jīng)有了一些用于xml data binding的框架,我們?cè)賮?lái)看看同樣也是做xml databinding但是并沒(méi)有實(shí)現(xiàn)JAXB的框架:
一、Castor
Castor不僅僅支持對(duì)XML的綁定,它還支持對(duì)LDAP對(duì)象,用OQL將SQL查詢映射為對(duì)象,以及對(duì)JDO的支持。與JAXB不同的是,它需要的僅僅是xml的Schema。通過(guò)xml的Schema來(lái)生成相應(yīng)的Java源代碼,編譯之后就可以marshalling和unmarshalling了。
二、Zeus
Zeus與Castor和JAXB相比,在class generation方面多做了些步驟,因此它可以支持多種的約束關(guān)系,包括對(duì)DTD,XML Schema以及TREX等等的支持。不過(guò)目前該項(xiàng)目好像已經(jīng)不做了。
三、Quick
Quick也是一個(gè)非常靈活的框架,詳細(xì)的情況可以google一下。
3、JAXM
JAXM是為SOAP通信提供訪問(wèn)方法和傳輸機(jī)制的API。目前它支持SOAP1.1規(guī)范以及同步和異步通信。JAXM定義了大量服務(wù),JAXM的實(shí)現(xiàn)產(chǎn)品將會(huì)提供這些服務(wù),使得開(kāi)發(fā)者不用面對(duì)復(fù)雜的通信系統(tǒng)。JAXM體系結(jié)構(gòu)中包括兩個(gè)重要的組件:JAXM Client和Provider。Client通常是作為J2EE web或EJB容器的一部分,以提供你所寫(xiě)的程序訪問(wèn)JAXM服務(wù)的能力。而Provider可以以不同的方式實(shí)現(xiàn),主要負(fù)責(zé)發(fā)送和接收SOAP消息。這樣你就可以直接地使用JAXM的API直接發(fā)送和接收SOAP消息。
4、JAX-RPC
JAX-RPC是通過(guò)xml進(jìn)行遠(yuǎn)程過(guò)程調(diào)用的Java API。它是基于SOAP技術(shù)的,使用SOAP作為底層的協(xié)議。這樣對(duì)于開(kāi)發(fā)者來(lái)說(shuō),只有方法,參數(shù),返回值是可見(jiàn)的,而底層的soap通信都被隱藏起來(lái)了,開(kāi)發(fā)人員不需要與之直接打交道。
JAXM和JAX-RPC在Web Services方面有很重要的作用。
補(bǔ)充: JAXP框架查找具體實(shí)現(xiàn)的步驟
JDK1.4自帶的是JAXP的參考實(shí)現(xiàn):Crimson的DOM, SAX解析器,Xalan的XSLT處理器。
如果你想用其他的實(shí)現(xiàn)替代它們,那就必須了解JAXP框架查找實(shí)現(xiàn)的具體步驟:
1、首先,算法會(huì)通過(guò)諸如javax.xml.transform.TranformerFactory這樣的系統(tǒng)屬性來(lái)定位具體實(shí)現(xiàn)的類(lèi)。你可以在命令行中直接指定:
java -Djavax.xml.transform.TransformerFactory=com.foo.ConcreteTransformer YourApp
ConcreteTransformer是實(shí)現(xiàn)了TransformerFactory的子類(lèi),如果你用的是ant,也可以在build file中指定。
同樣地有,javax.xml.parsers.document.uilderFactory和javax.xml.parsers.SAXBuilderFactory屬性。
2、接著,如果系統(tǒng)屬性中沒(méi)有指定,JAXP將會(huì)在JRE的目錄中查找lib/jaxp.properties屬性文件,它像一般的properties文件一樣是由name=value組成的,假設(shè)有如下的一行:
javax.xml.transform.TransformerFactory=com.foo.ConcreteTransformer
那么JAXP就會(huì)使用相應(yīng)的TransformerFactory實(shí)現(xiàn)。
在Java程序中,你可以通過(guò)如下的代碼獲得JRE所在的目錄:
String javaHomeDir = System.getProperty("java.home");
不過(guò)要注意,如果是在一些IDE中使用,IDE會(huì)改變這個(gè)java.home的值,比如JBuilder。
3、如果jaxp.properties不存在或者沒(méi)有相應(yīng)的值,那么JAXP將會(huì)使用JAR文件的服務(wù)提供體制來(lái)定位正確的子類(lèi)。簡(jiǎn)單地說(shuō),你可以在jar文件的META-INF/services目錄下新建一個(gè)名為javax.xml.transform.TransformerFactory的文件,這個(gè)文件中只有一行:com.foo.ConcreteTransformer就可以了。
4、最后,如果上面3步都沒(méi)有找到任何具體的實(shí)現(xiàn),JAXP就會(huì)使用缺省的實(shí)現(xiàn):Crimson和Xalan。
<>