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