JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Java & XML、Web Service  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 JAXB 簡介 [精華]
iampoya

Speculator

版主

發文: 169
積分: 8
於 2003-07-27 00:28 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
相信正常一點的程式設計人員都覺得XML很煩
如果你是技術狂,那就算了,當我沒說 :p
通常我們只是想要讀一個能跨平台的文件
幹嘛要去了解一堆有的沒的定義及如何parse文件的東東

為什麼不讓這些煩人的事情包裝起來
我們只要關心我讀進來的資料該如何處理
處理完再把它順利的寫回就好哩

這個念頭相信在大家的心中都出現過
所以恭喜大家,前人已經幫我們種好樹了
大家趕快到樹下乘涼吧
JAXB就是我們要的東東

Java Architecture for XML Binding (JAXB)
簡單的講就是提供了一個自動在xml文件與java物件mapping的機制

所以我們不用去了解啥米弟踢弟、死雞碼該如何定義
也不用學習如何去吹薩克斯風或挖洞給自已跳

首先要下載Java Web Services Developer Pack
其中便包含有JAXB的實作套件

接下來要設定相關的環境變數
範例如下:
set JAVA_HOME=your_jdk_home_path
set JWSDP_HOME=your_jwsdp_home_path
set JAXB_HOME=%JWSDP_HOME%\jaxb-1.0
set JAXB_LIBS=%JAXB_HOME%\lib
set JAXP_LIBS=%JWSDP_HOME%\jaxp-1.2.2\lib
set JWSDP_LIBS=%JWSDP_HOME%\jwsdp-shared\lib
set PATH=%JAXB_HOME%\bin;%JWSDP_HOME%\jwsdpshared\bin;%PATH%
以下請自行連結為一行
set CLASSPATH=%JAXB_LIBS%\jaxb-api.jar;
%JAXB_LIBS%\jaxb-ri.jar;%JAXB_LIBS%\jaxb-xjc.jar;
%JAXB_LIBS%\jaxb-libs.jar;
%JAXP_LIBS%\jaxb-api.jar;
%JAXP_LIBS%\endorsed\xercesImpl.jar;
%JAXP_LIBS%\endorsed\xalan.jar;
%JAXP_LIBS%\endorsed\sax.jar;
%JAXP_LIBS%\endorsed\dom.jar;
%JWSDP_LIBS%\jax-qname.jar;
%JWSDP_LIBS%\namespace.jar;.;

接下來我們一步步來看該如何使用JAXB
首先要先綁架xml schema
透過JAXB所提供的工具xjc
可產生一組用以描述xml schema的Java介面及實作類別
xjc指令格式如下:
xjc -p <generated_package> -d <target_directory> xml_schema
例如:
xjc -p test.jaxb -d work_area books.xsd
接著要編譯所產生的介面及實作類別
javac test/jaxb/*.java test/jaxb/impl/*.java

再來就可試著透過Unmarshal的方式來取得xml文件裡的資料
可以在測試程式中撰寫類似以下程式碼

JAXBContext jc = JAXBContext.newInstance("test.jaxb");
Unmarshaller unmarshaller = jc.createUnmarshaller();
Collection collection =
(Collection)unmarshaller.unmarshal(new File( "books.xml"));
CollectionType.BooksType booksType = collection.getBooks();
List bookList = booksType.getBook();

然後就可以取出xml文件裡的資料

for( int i = 0; i < bookList.size();i++ ) {
test.jaxb.BookType book =(test.jaxb.BookType) bookList.get(i);
System.out.println("Item id: " + book.getItemId());
System.out.println("Book Name: " + book.getName().trim());
}

另外也可利用
unmarshaller.setValidating(true);
來指定是否要在Unmarshal的同時來驗證此份xml文件格式正確與否

再來就可試著透過Marshal的方式來將資料寫到所指定的xml文件裡
可以在測試程式中撰寫類似以下程式碼
JAXBContext jaxbContext = JAXBContext.newInstance("test.jaxb");
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT ,
new Boolean(true));
ObjectFactory objFactory = new ObjectFactory();
Collection collection= (Collection) objFactory.createCollection();
Collection.BooksType booksType = objFactory.
createCollectionTypeBooksType();
List bookList = booksType.getBook();
BookType book = objFactory.createBookType();
book.setItemId("777");
book.setName("JAXB簡介");

然後就可以將資料寫入我們所指定的xml文件裡

bookList.add(book);
collection.setBooks(booksType);
marshaller.marshal(collection,
new FileOutputStream("jaxb_test.xml"));

另外也可利用Validator類別來驗證此份xml文件格式正確與否
範例如下:
Validator validator = jaxbContext.createValidator();
validator.validate(collection));

若您還想知道更多關於JAXB使用上的細節,請上官方網站喔 ^_^
http://java.sun.com/xml/jaxb/

*********************無版權宣告*********************

版權沒有,歡迎轉載
轉載時請保留作者姓名及此份宣告

本文是為了方便新手入門學習
歡迎大家給小弟指正或補充更多詳盡的資料
my email: iampoya@pchome.com.tw

本文同步刊於
http://www.javaworld.com.tw
http://www.midicat.com/poya/ezjava

****************************************************


reply to postreply to post
作者 Re:JAXB 簡介 [Re:iampoya]
ray_linn

什么都不懂的小白

版主

發文: 540
積分: 10
於 2003-07-27 01:43 user profilesend a private message to usersend email to ray_linnreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
必須說 ,java在xml方面必須做得更好,更簡單,和C#比起來,還沒有一隻api可以說上方便。。。。

browser edited on 2003-07-27 01:47
reply to postreply to post
飞翔的候鸟
作者 Re:JAXB 簡介 [Re:iampoya]
saijone

Web Services

版主

發文: 470
積分: 24
於 2003-07-27 05:42 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
在早期JAXB尚未支援Schema時, 我們是用 Castor, 基本上Castor Project
中有一個功能跟WSDP的JAXB-RI功能一樣, 你給它一份 Schema 它便幫你產
生 Java Class(es), 或是你給它一個 Java Class 它便幫你產生 Schema. 不管是
JAXB或是 Castor, 他們的核心觀念都一樣:
Schema或 DTD 對應到 Java Class, 而依據 Schema/DTD 寫出的 XML 對應到
Java Oject. (The XML is an instance of the schema/DTD, and the
corresponding Java Object is an instance of corresponding schema/DTD)

這技術應用在處裡 configuration file 或 deployment descriptor 上非常方便.
你先為你要的 configuration file 或 deployment descriptor 寫好 schema,
JAXB 或 Castor 便會幫你產生 Java codes. 你不用在那邊走DOM tree 或
Handle SAX Event.

然而由於這樣的技術太重要, 尤其是在 WebServices 中處裡 XML 格式的
SOAP message 時也需要將之 de-serialize 成 Java Object 或將傳回值 serialize
回 SOAP(XML), 所以在 JAX-RPC(Java API for XML-based RPC) 中除了定義
標準的 Java to SOAP/XML type mapping (例如 int 對應到 xsd:int) 外, 也有
一個尚未被納入標準的 Serialization framework.基本上這 framework 解決了
一個不算單純的問題:
如果一個 array 中有兩個 reference 指到同一物件如何做Serialization?
1
2
3
4
5
6
    String[] array = new String[3];
    String a = "a";
    String b = "b";
    array[0] = a;
    array[1] = b;
    array[2] = a;

在 SOAP Encoding, 可以用href來表達這樣的情形. WSDP中的 JAXRPC-RI也
有implement 這樣的觀念

另外在JSR109 Enterprise Web Services 中, User可以利用一個
deployment descriptor (jaxrpc mapping file) 來定義 Java variable class 對
schema element 的 mapping(name之間的對應).

關於.NET嗎就更Cool了, 在 code 上用些 metadata annotation 就成了:
1
2
3
4
5
6
7
8
public class Group {                   
    [SoapAttribute(Namespace = "http://foo.com")]
    public string GroupName; 
 
    [SoapElement(DataType = "nonNegativeInteger",
           ElementName = "PosInt")] 
    public string PostitiveInt; 
} 


這樣的 metadata annotation 未來將會在Java中出現(好像是 Tiger/1.5 中
就會有): http://www.jcp.org/en/jsr/detail?id=175

http://developer.java.sun.com/developer/technicalArticles/xml/jaxb/
http://jaxb.dev.java.net/


saijone edited on 2003-07-27 05:47
reply to postreply to post
You don't need a reason to help people
作者 Re:JAXB 簡介 [Re:iampoya]
saintk





發文: 118
積分: 2
於 2004-09-05 22:50 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
剛好我最近也在寫JAXB
jar檔數目還是一樣
以前的版本是有jaxb-ri.jar
現在的新版則是變成jaxb-impl.jar
系統設定那邊改一下就好了

不過你那程式是用JAXB的程式嗎???Question


reply to postreply to post
作者 Re:JAXB 簡介 [Re:iampoya]
leonyanj





發文: 3
積分: 0
於 2004-09-07 22:14 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
当前项目正卡在一系列类型映射问题上。JAX-RPC原版本中也有相关的XML-Java之间的类型映射,最近的2.0版本开始将这个工作基本上完全交付给JAXB2.0 ,并且JAX-RPC(JSR101)2.0和JAXB2.0都需要JDK1.5的支持。

reply to postreply to post
作者 Re:JAXB 簡介 [Re:iampoya]
StrUtsOne





發文: 9
積分: 0
於 2005-01-08 13:41 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
iampoya wrote:
CollectionType.BooksType booksType = collection.getBooks();


请问板主:这个CollectionType.BooksType是什么东西,我用java.sun.com上面那个books.xsd产生的class里面没有找到这个类或变量.


reply to postreply to post
作者 Re:JAXB 簡介 [Re:StrUtsOne]
iampoya

Speculator

版主

發文: 169
積分: 8
於 2005-01-09 10:45 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
That’s just a pseudo code Wink

reply to postreply to post
Japan Adult Video Album
作者 Re:JAXB 簡介 [Re:iampoya]
stanley





發文: 73
積分: 0
於 2005-11-17 10:37 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
請問用 xjc 產生的檔案中, runtime這個package 有個MSVValidator的類別它實作的介面IDContextProvider2是包含在哪個jar檔?

public class MSVValidator implements XMLSerializer, IDContextProvider2

找到答案了 http://forums.java.sun.com/thread.jspa?threadID=631819&tstart=0


stanley edited on 2005-11-17 11:02
reply to postreply to post
作者 Re:JAXB 簡介 [Re:iampoya]
IORI71721A





發文: 5
積分: 0
於 2011-02-17 12:23 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
請問 我安裝的JWSDP 為2.0 版的
我CLASSPATH 也設定了
為何我XJC SHIPORDER.XSD 執行後
IMPL\*.JAVA 都不會產生阿 謝謝


reply to postreply to post
» JWorld@TW »  Java & XML、Web Service

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8