第35章 複雑なタイプの使用

概要

複合型には複数の要素を含めることができ、それらは属性を持つことができます。それらは、型定義によって表されるデータを保持できる Java クラスにマップされます。通常、マッピングは、コンテンツモデルの要素と属性を表す一連のプロパティーを持つ Bean へのマッピングです。

35.1. 基本的な複合型マッピング

概要

XML スキーマの複合型は、単純な型よりも複雑な情報を含む構造を定義します。最も単純な複合型は、属性を持つ空の要素を定義します。より複雑な複合型は、要素のコレクションで設定されています。

デフォルトでは、XML スキーマ複合型は Java クラスにマップされ、XML スキーマ定義にリストされている各要素と属性を表すメンバー変数があります。クラスには、メンバー変数ごとにセッターとゲッターがあります。

XML スキーマでの定義

XML Schema の複雑なタイプは、complexType 要素を使用して定義されます。complexType 要素は、データの構造を定義するために使用される残りの要素をラップします。名前付き型定義の親要素として、または要素に保存されている情報の構造を匿名的に定義する element 要素の子として表示することができます。complexType 要素を使用して名前付き型を定義する場合は、name 属性を使用する必要があります。name 属性は、タイプを参照するための一意の識別子を指定します。

1 つ以上の要素を含む複合型定義には、表35.1「複合型で要素がどのように表示されるかを定義するための要素」 で説明されている子要素の 1 つがあります。これらの要素は、指定された要素がタイプのインスタンスでどのように表示されるかを決定します。

表35.1 複合型で要素がどのように表示されるかを定義するための要素

要素説明

all

複合型の一部として定義されたすべての要素は、型のインスタンスに表示される必要があります。ただし、それらは任意の順序で表示できます。

choice

複合型の一部として定義された要素の 1 つだけが、型のインスタンスに表示されます。

sequence

複合型の一部として定義されたすべての要素は、型のインスタンスに表示される必要があり、型定義で指定された順序でも表示される必要があります。

注記

複合型定義が属性のみを使用する場合は、表35.1「複合型で要素がどのように表示されるかを定義するための要素」 で説明されている要素の 1 つは必要ありません。

要素の表示方法を決定したら、1 つまたは複数の element 要素の子を定義に追加して、要素を定義します。

例35.1「XML スキーマ複合型」 は、XML スキーマでの複合型定義を示しています。

例35.1 XML スキーマ複合型

<complexType name="sequence">
  <sequence>
    <element name="name" type="xsd:string" />
    <element name="street" type="xsd:short" />
    <element name="city" type="xsd:string" />
    <element name="state" type="xsd:string" />
    <element name="zipCode" type="xsd:string" />
  </sequence>
</complexType>

Java へのマッピング

XML スキーマの複合型は Java クラスにマップされます。複合型定義の各要素は、Java クラスのメンバー変数にマップされます。複合型の要素ごとに、ゲッターメソッドとセッターメソッドも生成されます。

生成されたすべての Java クラスは @XmlType アノテーションでデコレートされます。マッピングが名前付きの複合型の場合は、アノテーション namecomplexType 要素の name 属性の値に設定されます。複合型が要素定義の一部として定義されている場合、@XmlType アノテーションの name プロパティーは、element 要素の name 属性の値になります。

注記

「インラインタイプの要素の Java マッピング」 で説明されているように、生成されるクラスが要素定義の一部として定義された複合型に対して生成される場合、クラスに @XmlRootElement アノテーションが付けられます。

XML スキーマ複合型の要素を処理する方法を示すガイドラインをランタイムに提供するために、コードジェネレーターは、クラスとそのメンバー変数を装飾するために使用されるアノテーションを変更します。

すべての複合型

すべての複合型は、all 要素を使用して定義されます。それらは次のように注釈が付けられています。

  • @XmlType アノテーションの propOrder プロパティーは空です。
  • 各要素は @XmlElement アノテーションで装備されています。
  • @XmlElement アノテーションの required プロパティーが true に設定されています。

    例35.2「すべての複雑なタイプのマッピング」 は、2 つの要素を持つすべての複合型のマッピングを示しています。

    例35.2 すべての複雑なタイプのマッピング

    @XmlType(name = "all", propOrder = {
    
    })
    public class All {
        @XmlElement(required = true)
        protected BigDecimal amount;
        @XmlElement(required = true)
        protected String type;
    
        public BigDecimal getAmount() {
            return amount;
        }
    
        public void setAmount(BigDecimal value) {
            this.amount = value;
        }
    
        public String getType() {
            return type;
        }
    
        public void setType(String value) {
            this.type = value;
        }
    }
選択複合タイプ

選択複合型は、choice 要素を使用して定義されます。それらは次のように注釈が付けられています。

  • @XmlType アノテーションの propOrder プロパティーは、XML Schema 定義に表示される順序で要素の名前を一覧表示します。
  • メンバー変数には注釈が付けられていません。

    例35.3「選択複合型のマッピング」 は、2 つの要素を持つ選択複合型のマッピングを示しています。

    例35.3 選択複合型のマッピング

    @XmlType(name = "choice", propOrder = {
        "address",
        "floater"
    })
    public class Choice {
    
        protected Sequence address;
        protected Float floater;
    
        public Sequence getAddress() {
            return address;
        }
    
        public void setAddress(Sequence value) {
            this.address = value;
        }
    
        public Float getFloater() {
            return floater;
        }
    
        public void setFloater(Float value) {
            this.floater = value;
        }
    
    }
シーケンスコンプレックスタイプ

シーケンスのコンプレックスタイプは、sequence 要素を使用して定義します。次のように注釈が付けられています。

  • @XmlType アノテーションの propOrder プロパティーは、XML Schema 定義に表示される順序で要素の名前を一覧表示します。
  • 各要素は @XmlElement アノテーションで装備されています。
  • @XmlElement アノテーションの required プロパティーが true に設定されています。

    例35.4「シーケンス複合型のマッピング」 は、例35.1「XML スキーマ複合型」 で定義された複合型のマッピングを示します。

    例35.4 シーケンス複合型のマッピング

    @XmlType(name = "sequence", propOrder = {
        "name",
        "street",
        "city",
        "state",
        "zipCode"
    })
    public class Sequence {
    
        @XmlElement(required = true)
        protected String name;
        protected short street;
        @XmlElement(required = true)
        protected String city;
        @XmlElement(required = true)
        protected String state;
        @XmlElement(required = true)
        protected String zipCode;
    
        public String getName() {
            return name;
        }
    
        public void setName(String value) {
            this.name = value;
        }
    
        public short getStreet() {
            return street;
        }
    
        public void setStreet(short value) {
            this.street = value;
        }
    
        public String getCity() {
            return city;
        }
    
        public void setCity(String value) {
            this.city = value;
        }
    
        public String getState() {
            return state;
        }
    
        public void setState(String value) {
            this.state = value;
        }
    
        public String getZipCode() {
            return zipCode;
        }
    
        public void setZipCode(String value) {
            this.zipCode = value;
        }
    }