Java中關於XML的API

來源:互聯網
上載者:User

簡單介紹一下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的通用的介面。這樣在你的程式中你只要使用這些通用的介面,當你需要改變具體的實現時候也不需要修改代碼。比如,你用的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,雖然它沒有實現JAXP,但是由於它使用的簡單性,還是很受歡迎,並且成為了JCP正式推薦的API。它也是一種樹狀的結構表現XML,在使用方法上要比w3c的dom標準簡單易用的多。最新版本的JDOM在其內部已經開始使用JAXP的API,它會儘可能的去調用JAXP的API,如果不行就使用自己的預設XML解析器Xerces,XSLT處理器Xalan。

  2、JAXB定義了Java資料對象和xml結構之間的一種雙向映射關係。這樣你就可以很方便地將一個JavaObject Storage Service為一個xml文檔,也可以從一個xml文檔執行個體化一個Java對象。它的結構是這樣子的:首先要有xml的dtd以及binding schema(這個不是xml的schema,而是一個定義Java對象和xml結構之間映射關係xml文檔),通過這兩個檔案JAXB就可以產生與xml文檔結構一致的Java源檔案,編譯之後就可以很方便地通過具體的xml文檔得到與xml結構一致的Java類(就是產生的那些類)unmarshalling,反過來marshalling也可以。

  它的缺點也很明顯,一旦xml的結構發生了改變,就要重新寫bindng schema以及重建編譯Java類。

  sun的動作總是一如既往地慢,在JAXB出台之前已經有了一些用於xml data binding的架構,我們再來看看同樣也是做xml databinding但是並沒有實現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等等的支援。不過目前該項目好像已經不做了。

  三、Quick

  Quick也是一個非常靈活的架構,詳細的情況可以google一下。

  3、JAXM

  JAXM是為SOAP通訊提供存取方法和傳輸機制的API。目前它支援SOAP1.1規範以及同步和非同步通訊。JAXM定義了大量服務,JAXM的實現產品將會提供這些服務,使得開發人員不用面對複雜的通訊系統。JAXM體繫結構中包括兩個重要的組件:JAXM Client和Provider。Client通常是作為J2EE web或EJB容器的一部分,以提供你所寫的程式訪問JAXM服務的能力。而Provider可以以不同的方式實現,主要負責發送和接收SOAP訊息。這樣你就可以直接地使用JAXM的API直接發送和接收SOAP訊息。

  4、JAX-RPC

  JAX-RPC是通過xml進行遠端程序呼叫的Java API。它是基於SOAP技術的,使用SOAP作為底層的協議。這樣對於開發人員來說,只有方法,參數,傳回值是可見的,而底層的soap通訊都被隱藏起來了,開發人員不需要與之直接打交道。

  JAXM和JAX-RPC在Web Services方面有很重要的作用。

  補充: JAXP架構尋找具體實現的步驟

  JDK1.4內建的是JAXP的參考實現:Crimson的DOM, SAX解析器,Xalan的XSLT處理器。

  如果你想用其他的實現替代它們,那就必須瞭解JAXP架構尋找實現的具體步驟:

  1、首先,演算法會通過諸如javax.xml.transform.TranformerFactory這樣的系統屬性來定位具體實現的類。你可以在命令列中直接指定:

  java -Djavax.xml.transform.TransformerFactory=com.foo.ConcreteTransformer YourApp

  ConcreteTransformer是實現了TransformerFactory的子類,如果你用的是ant,也可以在build file中指定。

  同樣地有,javax.xml.parsers.document.uilderFactory和javax.xml.parsers.SAXBuilderFactory屬性。

  2、接著,如果系統屬性中沒有指定,JAXP將會在JRE的目錄中尋找lib/jaxp.properties屬性檔案,它像一般的properties檔案一樣是由name=value組成的,假設有如下的一行:

  javax.xml.transform.TransformerFactory=com.foo.ConcreteTransformer

  那麼JAXP就會使用相應的TransformerFactory實現。

  在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步都沒有找到任何具體的實現,JAXP就會使用預設的實現:Crimson和Xalan。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.