使用 JAXB schemagen 工具從 Java 類別產生 XML 綱目檔

使用 Java™ Architecture for XML Binding (JAXB) schemagen 工具,從 Java 類別產生 XML 綱目檔。

開始之前

識別要對映至 XML 綱目檔的 Java 類別或一組 Java 物件。

關於這項作業

使用 JAXB API 和工具來建立 Java 類別和 XML 綱目之間的對映。 XML 綱目文件說明 XML 文件中的資料元素及關係。 在資料對映或連結存在之後,您可以在 Java 物件之間來回轉換 XML 文件。 您現在可以存取儲存在 XML 文件中的資料,而不需要瞭解資料結構。

如果要使用從現有 JavaBeans 或 Enterprise Bean 開始的由下而上開發方法來開發 Web 服務,請使用 wsgen 工具來產生 Java API for XML-Based Web Services (JAX-WS) 應用程式的構件。 產生應用程式的 Java 構件之後,您可以使用 JAXB 綱目產生器 schemagen 指令行工具,從現有的 Java 應用程式建立 XML 綱目文件,以代表 Java 應用程式的資料元素。 JAXB 綱目產生器會處理 Java 原始檔或類別檔。 Java 類別註釋可讓您自訂從現有 Java 類別至所產生綱目元件的預設對映。 XML 綱目檔以及標註的 Java 類別檔包含 JAXB 執行時期剖析 XML 文件以進行配置和解除配置所需的所有必要資訊。

您可以使用 JAXB 綱目產生器 ( schemagen 指令行工具) ,從代表 Java 應用程式資料元素的現有 Java 應用程式建立 XML 綱目文件。 JAXB 綱目產生器會處理 Java 原始檔或類別檔。 Java 類別註釋可讓您自訂從現有 Java 類別至所產生綱目元件的預設對映。 XML 綱目檔以及標註的 Java 類別檔包含 JAXB 執行時期剖析 XML 文件以進行配置和解除配置所需的所有必要資訊。

支援的配置: 在 z/OS® 平台上不支援 wsimportwsgen schemagenxjc 指令行工具。 此功能由隨在 z/OS 平台上執行的 WebSphere® Application Server 提供的組合工具提供。 請閱讀 JAX-WS 應用程式的這些指令行工具以進一步瞭解這些工具。
最佳作法: WebSphere Application Server 提供 Java API for XML-Based Web Services (JAX-WS) 和 Java Architecture for XML Binding (JAXB) 工具。 wsimportwsgenschemagenxjc 指令行工具位於 WebSphere Application Server traditionalapp_server_root\bin\ 目錄中。 xjcschemagen 指令位於 Liberty 設定檔中的 app_server_root\jaxb\bin\ 目錄中。 在某些情況下, WebSphere Application Server 和 JDK 提供的工具所產生的構件支援相同層次的規格。 一般而言,JDK 工具所產生的構件可以在其他標準執行時期環境之間轉移。 不過,最佳作法是使用本產品隨附的工具,在 WebSphere Application Server 環境內實現無縫整合,並利用只有 WebSphere Application Server才支援的特性。 如果要利用 JAX-WS 和 JAXB 2.2 版工具,請使用在 app_server_root\bin\ 目錄內之應用程式伺服器所提供的工具。
支援的配置: 本產品支援 JAXB 2.2 規格。 在資料連結方面,JAX-WS 2.2 需要 JAXB 2.2。

JAXB 提供編譯支援,可讓您配置 schemagen 綱目產生器,使它不會自動產生新的綱目。 如果您使用一般綱目,例如「全球資訊網協會 (W3C)」、「XML 綱目」、「Web 服務說明語言 (WSDL)」或 WS-Addressing ,且您不想要針對所參照的特定套件產生新的綱目,則這會很有用。 @XmlSchema 註釋上的 location 屬性會導致 schemagen 產生器參照現有綱目的 URI ,而不是產生新的綱目。

除了從指令行使用 schemagen 工具之外,您還可以從 Ant 建置環境內呼叫這個 JAXB 工具。 從 Ant 建置環境內使用 com.sun.tools.jxc.SchemaGenTask Ant 作業來呼叫 schemagen 綱目產生器工具。 為了讓功能正常運作,這項 Ant 作業需要您使用 ws_ant Script 來呼叫 Ant。

避免麻煩: 執行 schemagen 工具時,綱目產生器無法正確地從 package-info 類別檔讀取 @XmlSchema 註釋,以衍生 targetNamespaces。 請使用下列其中一種方法,而不是使用 @XMLSchema 註釋:
  • 提供含有 @XmlSchema的 package-info.java 檔案; 例如:
    schemagen sample.Address sample\package-info.java
  • 使用 @XmlType 註釋名稱空間屬性來指定名稱空間; 例如:
    @XmlType(namespace="http://myNameSpace")

程序

  1. 尋找要在產生 XML 綱目檔時使用的 Java 原始檔或 Java 類別檔。
    請確定 Java 類別檔所參照的所有類別都包含在類別路徑中,或使用-classpath/-cp 選項提供給工具。
  2. 使用 JAXB 綱目產生器 schemagen 指令來產生 XML 綱目。
    綱目產生器位於 app_server_root\bin\ 目錄中。
    [Windows]
    app_server_root\bin\schemagen.bat myObj1.java myObj2.java
    [Linux][AIX][HP-UX][Solaris]
    app_server_root/bin/schemagen.sh myObj1.java myObj2.java
    [IBM i]
    app_server_root/bin/schemagen myObj1.java myObj2.java

    參數 myObj1.javamyObj2.java是包含資料物件的 Java 檔案名稱。 如果 myObj1.javamyObj2.java 參照未傳遞至 schemagen 指令的 Java 類別,您必須使用 -cp 選項來提供這些 Java 類別的類別路徑位置。

    請閱讀 schemagen 指令,以進一步瞭解這個指令及您可以指定的其他選項。
  3. (選用) 使用 javax.xml.bind.annotations 套件中定義的 JAXB 程式註釋來自訂 JAXB XML 綱目對映。
  4. (選用) 在 @XmlSchema 註釋上配置 location 內容,以指示綱目編譯器使用現有的綱目,而不是產生新的綱目。
    例如,
    @XmlSchema(namespace="foo")
    package foo;
    @XmlType
    class Foo {
    @XmlElement Bar zot;
    }
    @XmlSchema(namespace="bar",
    location="http://example.org/test.xsd")
    package bar;
    @XmlType
    class Bar {
    ...
    }
    <xs:schema targetNamespace="foo">
    <xs:import namespace="bar"
    schemaLocation="http://example.org/test.xsd"/>
    <xs:complexType name="foo">
    <xs:sequence>
    <xs:element name="zot" type="bar:Bar" xmlns:bar="bar"/>
    </xs:sequence>
    </xs:complex
    location="http://example.org/test.xsd" 會向 schemagen 工具指出現有綱目上的位置,且不會產生新綱目。

結果

現在您已從 Java 類別產生 XML 綱目檔,您已準備好將 Java 物件配置及解除配置為 XML 實例文件。

避免麻煩: schemagen 指令不會區分不同 Java 套件內定義有相同 @XMLType 名稱的多個 @XMLType 註釋之間的 XML 名稱空間。 當此實務範例發生時,會產生下列錯誤:
錯誤: 兩個類別具有相同的 XML 類型名稱 ....
請使用 @XmlType.name 和 @XmlType.namespace 來指派不同的名稱給它們 ...
此錯誤指出您具有名稱相同但存在於不同 Java 套件內的類別名稱或 @XMLType.name 值。 若要防止此錯誤,請新增 @XML.Type.namespace 類別新增至現有的 @XMLType 註釋,以區分 XML 類型。

範例

下列範例說明 JAXB 工具如何從現有的 Java 類別 Bookdata.java產生 XML 綱目檔。
  1. 將下列 Bookdata.java 檔案複製到暫存目錄。
    package generated;
    
    import javax.xml.bind.annotation.XmlAccessType;
    import javax.xml.bind.annotation.XmlAccessorType;
    import javax.xml.bind.annotation.XmlAttribute;
    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlType;
    import javax.xml.datatype.XMLGregorianCalendar;
    
    
    
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "bookdata", propOrder = {
        "author",
        "title",
        "genre",
        "price",
        "publishDate",
        "description"
    })
    public class Bookdata {
    
        @XmlElement(required = true)
        protected String author;
        @XmlElement(required = true)
        protected String title;
        @XmlElement(required = true)
        protected String genre;
        protected float price;
        @XmlElement(name = "publish_date", required = true)
        protected XMLGregorianCalendar publishDate;
        @XmlElement(required = true)
        protected String description;
        @XmlAttribute
        protected String id;
    
         public String getAuthor() {
            return author;
        }
        public void setAuthor(String value) {
            this.author = value;
        }
        public String getTitle() {
            return title;
        }
    
         public void setTitle(String value) {
            this.title = value;
        }
    
      
        public String getGenre() {
            return genre;
        }
       
        public void setGenre(String value) {
            this.genre = value;
        }
    
        
        public float getPrice() {
            return price;
        }
    
        
        public void setPrice(float value) {
            this.price = value;
        }
    
       
        public XMLGregorianCalendar getPublishDate() {
            return publishDate;
        }
    
        
        public void setPublishDate(XMLGregorianCalendar value) {
            this.publishDate = value;
        }
    
       
        public String getDescription() {
            return description;
        }
    
        
        public void setDescription(String value) {
            this.description = value;
        }
    
       
        public String getId() {
            return id;
        }
    
        
        public void setId(String value) {
            this.id = value;
        }
    
    }
  2. 開啟命令提示字元。
  3. 從您複製 Bookdata.java 檔案的目錄執行 schemagen 綱目產生器工具。
    [Windows]
    app_server_root\bin\schemagen.bat Bookdata.java
    [Linux][AIX][HP-UX][Solaris]
    app_server_root/bin/schemagen.sh Bookdata.java 
    [IBM i]
    app_server_root/bin/schemagen Bookdata.java
  4. 產生 XML 綱目檔 schema1.xsd :
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    
      <xs:complexType name="bookdata">
        <xs:sequence>
          <xs:element name="author" type="xs:string"/>
          <xs:element name="title" type="xs:string"/>
          <xs:element name="genre" type="xs:string"/>
          <xs:element name="price" type="xs:float"/>
          <xs:element name="publish_date" type="xs:anySimpleType"/>
          <xs:element name="description" type="xs:string"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:string"/>
      </xs:complexType>
    </xs:schema>
    

如需 schemagen 指令的相關資訊,請參閱 JAXB 參照實作文件。