JAXB schemagen ツールを使用して Java クラスから XML スキーマ ファイルを生成する
Java™ Architecture for XML Binding (JAXB) schemagen ツールを使用して、Java クラスから XML スキーマ ファイルを生成します。
事前処理
このタスクの概要
JAXB API とツールを使用して、Java クラスと XML スキーマ間のマッピングを確立します。 XML スキーマ文書は、XML 文書内のデータ・エレメントと関係を記述します。 データ・マッピングまたはバインディングが存在するようになったら、 XML 文書と Java オブジェクトとの間で双方向に変換できます。 XML 文書に保管されているデータには、XML データ構造を理解していなくてもアクセスすることができます。
既存のものからボトムアップ開発アプローチを使用してWebサービスを開発するJavaBeansまたはエンタープライズBeanの場合は、wsgen Java API for XML-Based Web Services (JAX-WS) アプリケーションの成果物を生成するツール。 アプリケーションのJava成果物が生成されたら、JAXBスキーマジェネレータを使用して、既存のJavaアプリケーションからJavaアプリケーションのデータ要素を表すXMLスキーマドキュメントを作成できます。schemagenコマンドラインツール。 JAXB スキーマ ジェネレーターは、Java ソース ファイルまたはクラス ファイルのいずれかを処理します。 Java クラス アノテーションは、既存の Java クラスから生成されたスキーマ コンポーネントへのデフォルトのマッピングをカスタマイズする機能を提供します。 XML スキーマ ファイルと注釈付き Java クラス ファイルには、JAXB ランタイムが XML ドキュメントを解析してマーシャリングおよびアンマーシャリングするために必要なすべての情報が含まれています。
JAXBスキーマジェネレータを使用して、Javaアプリケーションのデータ要素を表す既存のJavaアプリケーションからXMLスキーマドキュメントを作成できます。schemagenコマンドラインツール。 JAXB スキーマ ジェネレーターは、Java ソース ファイルまたはクラス ファイルのいずれかを処理します。 Java クラス アノテーションは、既存の Java クラスから生成されたスキーマ コンポーネントへのデフォルトのマッピングをカスタマイズする機能を提供します。 XML スキーマ ファイルと注釈付き Java クラス ファイルには、JAXB ランタイムが XML ドキュメントを解析してマーシャリングおよびアンマーシャリングするために必要なすべての情報が含まれています。
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 インスタンス ドキュメントとしてマーシャリングおよびアンマーシャリングする準備が整いました。
エラー: Two classes have the same XML type name .... Use @XmlType.name and @XmlType.namespace to assign different names to them...このエラーはクラス名または@があることを示しますXMLType.name同じ名前を持つが異なる Java パッケージ内に存在する値。 このエラーを回避するには、既存の @XMLType アノテーションに @XML.Type.namespace クラスを追加して、XML タイプを区別します。
例
- 以下の
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.javaapp_server_root/bin/schemagen.sh Bookdata.javaapp_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="https://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 の資料を参照してください。