JAXB schemagen ツールを使用した Java クラスからの XML スキーマ・ファイルの生成
Java™ Architecture for XML Binding (JAXB) schemagen ツールを使用して、Java クラスから XML スキーマ・ファイルを生成します。
始める前に
このタスクについて
JAXB API およびツールを使用して、Java クラスと XML スキーマの間のマッピングを確立します。 XML スキーマ文書は、XML 文書内のデータ・エレメントと関係を記述します。 データ・マッピングまたはバインディングが存在するようになったら、 XML 文書と Java オブジェクトとの間で双方向に変換できます。 XML 文書に保管されているデータには、XML データ構造を理解していなくてもアクセスすることができます。
既存の JavaBeans またはエンタープライズ Bean から開始するボトムアップ開発により Web サービスを作成するには、wsgen ツールを使用して、Java API for XML-Based Web Services (JAX-WS) アプリケーションの成果物を生成します。アプリケーションの Java 成果物が生成された後、JAXB スキーマ・ジェネレーターの schemagen コマンド行ツールを使用して、 既存の Java アプリケーションから、Java アプリケーションのデータ・エレメントを表す XML スキーマ文書を作成できます。 JAXB スキーマ・ジェネレーターは、Java ソース・ファイルまたは クラス・ファイルのいずれかを処理します。 Java クラス・アノテーションは、 既存の Java クラスから生成済みのスキーマ・コンポーネントへの デフォルト・マッピングをカスタマイズする機能を提供します。 XML スキーマ・ファイルとアノテーション付き Java クラスには、XML 文書を構文解析してマーシャルおよびアンマーシャルするために JAXB ランタイムが必要とするすべての情報が含まれています。
既存の Java アプリケーションから、Java アプリケーションのデータ・エレメントを表す XML スキーマ文書を作成できます。 それには、JAXB スキーマ・ジェネレーターの schemagen コマンド行ツールを使用します。 JAXB スキーマ・ジェネレーターは、Java ソース・ファイルまたは クラス・ファイルのいずれかを処理します。 Java クラス・アノテーションは、 既存の Java クラスから生成済みのスキーマ・コンポーネントへの デフォルト・マッピングをカスタマイズする機能を提供します。 XML スキーマ・ファイルとアノテーション付き Java クラスには、XML 文書を構文解析してマーシャルおよびアンマーシャルするために JAXB ランタイムが必要とするすべての情報が含まれています。



JAXB ではコンパイルがサポートされていて、 新しいスキーマを自動的に生成しないように schemagen スキーマ・ジェネレーター を構成できるようになっています。このため、World Wide Web Consortium (W3C)、XML スキーマ、Web サービス記述言語 (WSDL)、または WS アドレス指定などの共通スキーマを使用しているときに、参照される特定のパッケージ用に新しいスキーマを生成せずに済みます。 @XmlSchema アノテーションのロケーション属性を使用すると、schemagen スキーマ・ジェネレーターは、 新しいスキーマを生成する代わりに、既存のスキーマの URI を参照するようになります。
コマンド行から schemagen ツールを使用する以外にも、 この JAXB ツールを Ant ビルド環境内で起動することができます。 Ant ビルド環境内で com.sun.tools.jxc.SchemaGenTask Ant タスクを使用して schemagen スキーマ・ジェネレーター・ツールを起動します。 この Ant タスクが正しく機能するようにするには、 ws_ant スクリプトを使用して Ant を起動する必要があります。

- @XmlSchema 付きの package-info.java ファイルを指定します。例:
schemagen sample.Address sample\package-info.java
- @XmlType アノテーションの名前空間属性を使用して、名前空間を指定します。
例:
@XmlType(namespace="http://myNameSpace")
手順
タスクの結果
Java クラスから XML スキーマ・ファイルを生成したので、 Java オブジェクトを XML インスタンス文書としてマーシャルおよびアンマーシャルする準備ができました。

エラー: 2 つのクラスに同じ XML タイプ名が割り当てられています....
Use @XmlType.name and @XmlType.namespace to assign different names to them...
このエラーは、名前が同一であって、
異なる Java パッケージ内に存在する
クラス名または @XMLType.name 値があることを示します。このエラーを回避するには、既存の @XMLType アノテーションに @XML.Type.namespace クラスを追加して、XML タイプを区別します。gotcha例
- 以下の 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; } }
- コマンド・プロンプトを開きます。
- Bookdata.java ファイルをコピーしたディレクトリーから
schemagen スキーマ・ジェネレーター・ツールを実行します。
app_server_root¥bin¥schemagen.bat Bookdata.java
app_server_root/bin/schemagen.sh Bookdata.java
app_server_root/bin/schemagen Bookdata.java
- 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 Reference implementation の資料を参照してください。