一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

JAXB(Java Architecture for XML Binding)新手學習筆記

 Java技術館 2011-12-10
各位先進好, 小弟最近剛學 JAXB, 整理了一些內(nèi)容,
希望能藉此減低往後入門者的痛感,
新手拙文, 請多指教,

總共會有八篇

初探 JAXB -- 生成物件及將物件轉(zhuǎn) xml
由 XML 字串生成物件 -- 如字面所述
用 NamespacePrefixMapper 修正 prefix -- 增加生出來的 xml 的可讀性
JAXB xsd 中使用其它文件的內(nèi)容 -- import / include / namespace
使用 Name space 解決名稱衝突 -- 撞名問題
為同名型態(tài)生成不同 class - Customizing JAXB Bindings -- 處理完撞名繼續(xù)看它
分門別類 - customize package bindings -- 管理 package
以 Ant 使用 JAXB xjc -- 用 Ant 做 xjc 動作

會陸續(xù)整理上來

第一篇 -- 初探 JAXB

1. 撰寫 XML Schema 的 xsd 檔


首先要準備一份 xsd 檔, 以便利用它來生成物件,

並使用 JAXB 的 API 進行物件與 xml 之間的轉(zhuǎn)換,

例如以下的 schema 代表一家製糖公司生產(chǎn)的 白糖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?xml version="1.0" encoding="UTF-8"?>
<!-- xmlns:xsd="http://www./2001/XMLSchema" ::
   http://www./2001/XMLSchema 
     可以想成使用到的其它份文件的 namespace
     xsd 則是要關聯(lián)到該文件中的 type 時用作前綴的短名稱
 
  targetNamespace="http://www.WhiteSugerCompany.com/ws" ::
    表示這一份文件的 namespace 為 http://www.WhiteSugerCompany.com/ws
    想像有多家製糖公司各自都有一個 suger 的 type,
    namespace 可以用來區(qū)分它們
   -->
<xsd:schema xmlns:xsd="http://www./2001/XMLSchema"
  xmlns:ws="http://www.WhiteSugerCompany.com/ws"
  targetNamespace="http://www.WhiteSugerCompany.com/ws">
 
  <!-- 一個 suger 的 type, 包含了 顏色, 甜度 -->
  <xsd:complexType name="suger">
    <xsd:sequence>
      <xsd:element name="color" type="xsd:string"/>
      <xsd:element name="sweetness" type="xsd:byte"/>
    </xsd:sequence>
  </xsd:complexType>
 
  <!-- 一個 type 為 suger 的 element -->
  <xsd:element name="Sugers" type="ws:suger"/>
</xsd:schema>



2. 使用 xjc 由 xsd 檔生成物件


接下來將 xsd 檔複製到 jdk\bin 資料夾中 執(zhí)行以下命令

1
C:\Program Files\Java\jdk1.6.0_21\bin>xjc -p org.iii.test.jaxb.whitesuger xmlSchema\WhiteSuger\WhiteSuger.xsd


就可以利用 jdk 所附的 xjc 程式, 由我們寫的 xsd 檔生成對應物件,

其中 \-p 是用來指定物件的 package,

xmlSchema\WhiteSuger\WhiteSuger.xsd 則是我們 xsd 檔的相對路徑,

這時可看到像以下的畫面及檔案






3. 利用 JAXB 由物件生成 XML


現(xiàn)在有了 xsd 檔及生出的物件, 接下來便可以使用 JAXB 提供的 API,

由物件直接生成 xml

首先將剛生成的 package 放到 src 中如下 (請先忽略紅框之外的部份)



然後要下載 JAXB RI 及將 lib 加入專案, 如下

下載 JAXB RI

下載頁

http://jaxb./2.2.3/

點 Download the binary, 副檔名要改 .jar

安裝

在下載後的 jar 檔點兩下, 第一頁版權宣告頁拉到最下方,

點 Accept, 會生出一個資料夾, 將它搬到適當?shù)胤郊纯?

然後將該資料夾下 lib 內(nèi)的 jar 檔加入專案內(nèi)

下載並加入 jar 後

接下來撰寫如下程式, 生成物件, 設置適當?shù)闹祦K生成 xml

這裡要注意的是, StringWriter 會以附加的方式持續(xù)加入內(nèi)容,

因此在加入新內(nèi)容前要清空它的 buffer

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package org.iii.test.jaxb;
 
import java.io.StringWriter;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.Marshaller;
import org.iii.test.jaxb.whitesuger.Suger;
import org.iii.test.jaxb.whitesuger.ObjectFactory;
 
public class Test {
 
  public static void main(String args[]){
 
    try{
      //-- get context instance
      JAXBContext ctx = JAXBContext.newInstance("org.iii.test.jaxb.whitesuger");
      ObjectFactory of = new ObjectFactory();
 
      //-- create Suger object
      Suger ws = of.createSuger();
 
      //-- set values
      ws.setColor("Cream color");
      ws.setSweetness((byte)20);
 
      //-- convert ws to JAXBElement
      JAXBElement<Suger> je = of.createSugers(ws);
      //-- get Marshaller
      Marshaller m = ctx.createMarshaller();
 
      //-- marshal JAXBElement into StringWriter
      StringWriter xml = new StringWriter();
      m.marshal(je, xml);
      System.err.println(xml.toString());
 
      //-- separator
      System.err.println("\n********\n********\n");
 
      //-- clear old content in StringWriter
      StringBuffer sb = xml.getBuffer();
      sb.setLength(0);
 
      //-- marshal JAXBElement into StringWriter with format
      m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
      m.marshal(je, xml);
      System.err.println(xml.toString());
    }
    catch (Exception e){
      e.printStackTrace();
    }
  }
}
 


輸出結果如下圖



其中兩行星號上方的是 未格式化 的輸出結果,

下方的則是經(jīng)過格式化的輸出結果


4. References


W3C 文件

http://www./TR/xmlschema-0/#DefnDeclars

史蒂芬 很詳盡的教學

http://home./idealist/WebService/

第二篇 -- 由 XML 字串生成物件


1. 使用 Unmarshaller


在 第一篇 之中, 我們將物件利用 JAXB 的 API 轉(zhuǎn)成 XML 字串,

通常之後我們會將轉(zhuǎn)出的字串傳到其它地方, 而其它地方收到後,

便要由 XML 字串 轉(zhuǎn)回相對應的物件,

假設已經(jīng)知道所要轉(zhuǎn)成的物件類型, 則轉(zhuǎn)換的程式如下

1
2
3
4
5
6
7
8
9
10
//-- get context instance
JAXBContext context = JAXBContext.newInstance(Suger.class);
//-- get unmarshaller
Unmarshaller um = context.createUnmarshaller();
//-- unmarshal xml string to JAXB element
JAXBElement<Suger> root = um.unmarshal(new StreamSource(new StringReader(
  xmlString)), Suger.class);
 
//-- get object from JAXB element
Suger ws2 = root.getValue();


這裡要注意的是, xmlString 要是未經(jīng) format 過的,


2. 完整程式及執(zhí)行結果


以下為完整的程式及執(zhí)行結果截圖, 其中包含 第一篇 的部份

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package org.iii.test.jaxb.test;
 
import java.io.StringReader;
import java.io.StringWriter;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.transform.stream.StreamSource;
 
import org.iii.test.jaxb.whitesuger.Suger;
import org.iii.test.jaxb.whitesuger.ObjectFactory;
 
public class Test {
 
  public static void main(String args[]){
 
    try{
      //-- get context instance
      JAXBContext ctx = JAXBContext.newInstance("org.iii.test.jaxb.whitesuger");
      ObjectFactory of = new ObjectFactory();
 
      //-- create Suger object
      Suger ws = of.createSuger();
 
      //-- set values
      ws.setColor("Cream color");
      ws.setSweetness((byte)20);
 
      //-- convert ws to JAXBElement
      JAXBElement<Suger> je = of.createSugers(ws);
      //-- get Marshaller
      Marshaller m = ctx.createMarshaller();
 
      //-- marshal JAXBElement into StringWriter
      StringWriter xml = new StringWriter();
      m.marshal(je, xml);
 
      //-- get xml string
      String xmlString = xml.toString();
      System.err.println(xmlString);
 
      //-- separator
      System.err.println("\n********\n********\n");
 
      //-- clear old content in StringWriter
      StringBuffer sb = xml.getBuffer();
      sb.setLength(0);
 
      //-- marshal JAXBElement into StringWriter with format
      m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
      m.marshal(je, xml);
      System.err.println(xml.toString());
 
      //-- get context instance
      JAXBContext context = JAXBContext.newInstance(Suger.class);
      //-- get unmarshaller
      Unmarshaller um = context.createUnmarshaller();
      //-- unmarshal xml string to JAXB element
      JAXBElement<Suger> root = um.unmarshal(new StreamSource(new StringReader(
          xmlString)), Suger.class);
 
      //-- get object from JAXB element
      Suger ws2 = root.getValue();
 
      //-- separator
      System.err.println("\n********\n********\n");
 
      //-- output object value
      System.err.println(" ws2 color = " + ws2.getColor());
      System.err.println(" ws2 sweetness = " + ws2.getSweetness());
    }
    catch (Exception e){
      e.printStackTrace();
    }
  }
}





3. References


實用教學

http://jaxb./guide/_XmlRootElement_and_unmarshalling.html


第三篇 -- 用 NamespacePrefixMapper 修正 prefix



1. 前言



在 第一篇 之中, 格式化的輸出如下

1
2
3
4
5
6
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:Sugers xmlns:ns2="http://www.WhiteSugerCompany.com/ws">
    <color>Cream color</color>
    <sweetness>20</sweetness>
</ns2:Sugers>
 


我們可以發(fā)現(xiàn), [http://www.WhiteSugerCompany.com/ws] 在這裡的 prefix,

變成了 ns2, 而不是 xsd 中的 ws,

我們可以實作 com.sun.xml.bind.marshaller.NamespacePrefixMapper,

來進行 Namespace 與 Prefix 之間對應的處理,



2. 實作並使用 NamespacePrefixMapper



實作 NamespacePrefixMapper

首先我們要實作 NamespacePrefixMapper, 實作程式如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package org.iii.test.jaxb.test;
 
import com.sun.xml.bind.marshaller.NamespacePrefixMapper;
 
public class NamespacePrefixMapperImpl extends NamespacePrefixMapper {
 
  public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) {
    //-- if namespace is "http://www.WhiteSugerCompany.com/ws"
    //-- map it to "ws"
    if( "http://www.WhiteSugerCompany.com/ws".equals(namespaceUri) )
      return "ws";
 
    // otherwise just use the default suggestion.
    return suggestion;
  }
}
 


使用 NamespacePrefixMapper

接下來是在 Marshaller 中 設定要使用的 NamespacePrefixMapperImpl 如下

1
m.setProperty("com.sun.xml.bind.namespacePrefixMapper",new NamespacePrefixMapperImpl());


只要加了這一行, 並且有實作 NamespacePrefixMapper,

便可得到如下圖的輸出, 可以看到原本的 ns2 都變成 ws 了,



完整程式如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package org.iii.test.jaxb.test;
 
import java.io.StringWriter;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.Marshaller;
 
import org.iii.test.jaxb.whitesuger.Suger;
import org.iii.test.jaxb.whitesuger.ObjectFactory;
 
public class Test {
 
  public static void main(String args[]){
 
    try{
      //-- get context instance
      JAXBContext ctx = JAXBContext.newInstance("org.iii.test.jaxb.whitesuger");
      ObjectFactory of = new ObjectFactory();
 
      //-- create Suger object
      Suger ws = of.createSuger();
 
      //-- set values
      ws.setColor("Cream color");
      ws.setSweetness((byte)20);
 
      //-- convert ws to JAXBElement
      JAXBElement<Suger> je = of.createSugers(ws);
      //-- get Marshaller
      Marshaller m = ctx.createMarshaller();
 
      StringWriter xml = new StringWriter();
      //-- marshal JAXBElement into StringWriter with format and mapped prefix
      m.setProperty("com.sun.xml.bind.namespacePrefixMapper",new NamespacePrefixMapperImpl());
      m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
      m.marshal(je, xml);
      System.err.println(xml.toString());
 
    }
    catch (Exception e){
      e.printStackTrace();
    }
  }
}




3. References



官方文件

http://download.oracle.com/docs/cd/E17802_01/webservices/webservices/docs/2.0/jaxb/vendorProperties.html




第八篇 -- 以 Ant 使用 JAXB xjc



1. 以 Ant 轉(zhuǎn)換 schema 為 java 檔



Ant 也可以用來將 xjc 的功能自動化,

讓我們不必再重覆 搬移 schema 檔案 下指令 搬回物件檔案 這些動作,

環(huán)境說明

這裡以 第七篇 -- 分門別類 - customize package bindings 的情況為例,

我們要撰寫一個 build.xml, 準備好 xsd 檔及 binding file,

執(zhí)行它後就會把 java 檔 產(chǎn)生出來放到正確的位置

build.xml 如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?xml version="1.0" encoding="BIG5"?>
 
<project name="genXsdClasses" default="genClass" basedir=".">
  <!-- 上面一行是 project 的進入點  -->
 
  <!-- Define JAXB home, 請依個人檔案路徑修改 -->
  <property name="jaxb.home" value="C:/java/jaxb-ri-20101209" />
 
  <!-- Define class path, 同上 -->
  <path id="classpath">
    <pathelement path="src" />
    <pathelement path="classes" />
    <pathelement path="schemas" />
    <fileset dir="lib" includes="*.jar" />
    <!-- this example only need this one below, above 4 just for example -->
    <fileset dir="${jaxb.home}" includes="lib/*.jar" />
  </path>
 
  <!-- This maps XJCTask to an Ant task named xjc.
    Refer to any of the build.xml under jaxb.home/samples for detail. -->
  <taskdef name="xjc" classname="com.sun.tools.xjc.XJCTask">
    <classpath refid="classpath" />
  </taskdef>
 
  <!-- Generate .java files by defined task xjc. -->
  <target name="genClass">
    <xjc destdir="src">
      <schema dir="xmlSchema/drink" includes="MixedSugerWater.xsd" />
      <binding dir="xmlSchema" includes="customBinding.xml" />
    </xjc>
 
  </target>
 
</project>


以下為執(zhí)行前及執(zhí)行後的截圖

首先是執(zhí)行前 src 下的情形



執(zhí)行後將 src 重新整理後的情形 以及執(zhí)行的訊息



寫得更完整, 加入清除舊檔的部份

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?xml version="1.0" encoding="BIG5"?>
 
<project name="genXsdClasses" default="genClass" basedir=".">
  <!-- 上面一行是 project 的進入點  -->
 
  <!-- Define JAXB home, 請依個人檔案路徑修改 -->
  <property name="jaxb.home" value="C:/java/jaxb-ri-20101209" />
  <!-- Define source and destnation, 同上 -->
 
  <!-- Define class path -->
  <path id="classpath">
    <pathelement path="src" />
    <pathelement path="classes" />
    <pathelement path="schemas" />
    <fileset dir="lib" includes="*.jar" />
    <!-- this example only need this one below, above 4 just for example -->
    <fileset dir="${jaxb.home}" includes="lib/*.jar" />
  </path>
 
  <!-- This maps XJCTask to an Ant task named xjc.
    Refer to any of the build.xml under jaxb.home/samples for detail. -->
  <taskdef name="xjc" classname="com.sun.tools.xjc.XJCTask">
    <classpath refid="classpath" />
  </taskdef>
 
  <!-- clear old files -->
  <target name="clean">
    <delete dir="src/org/iii/test/jaxb/drink" />
    <delete dir="src/org/iii/test/jaxb/suger" />
  </target>
 
  <!-- Generate .java files by defined task xjc. -->
  <target name="genClass" depends="clean">
    <xjc destdir="src">
      <schema dir="xmlSchema/drink" includes="MixedSugerWater.xsd" />
      <binding dir="xmlSchema" includes="customBinding.xml" />
    </xjc>
 
  </target>
 
</project>


執(zhí)行結果如下





2. References



官網(wǎng)

http://jaxb./jaxb20-ea/docs/xjcTask.html

注意, Parameter Attributes 表格中的 target 應改為 destdir 才能動

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    肥白女人日韩中文视频| 亚洲精品福利视频你懂的| 熟女乱一区二区三区丝袜| 麻豆果冻传媒一二三区| 欧美黑人在线一区二区| 国产熟女一区二区精品视频| 台湾综合熟女一区二区| 国产福利一区二区久久| 欧美av人人妻av人人爽蜜桃| 午夜福利大片亚洲一区| 在线观看免费午夜福利| 久久精品a毛片看国产成人| 亚洲免费视频中文字幕在线观看| 欧美黑人黄色一区二区| 亚洲欧美日韩国产综合在线| 亚洲国产av国产av| 国产在线不卡中文字幕| 国产不卡在线免费观看视频| 日本东京热视频一区二区三区| 尹人大香蕉中文在线播放| 久久人妻人人澡人人妻| 国产欧美一区二区另类精品| 免费观看一区二区三区黄片| 99精品国产一区二区青青| 中文字幕不卡欧美在线| 热久久这里只有精品视频| 亚洲精品熟女国产多毛| 亚洲中文字幕免费人妻| 国产精品香蕉一级免费| 少妇熟女精品一区二区三区| 欧美日韩亚洲国产精品| 国产精品香蕉一级免费| 观看日韩精品在线视频| 亚洲精品中文字幕在线视频| 亚洲天堂国产精品久久精品| 欧美又黑又粗大又硬又爽| 美女黄片大全在线观看| 日本不卡在线一区二区三区| 又黄又硬又爽又色的视频 | 清纯少妇被捅到高潮免费观看| 亚洲欧美日韩另类第一页|