Menu Close

第35章 複合型の使用

概要

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

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

概要

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

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

XML スキーマでの定義

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

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 複合型

all 複合型は、all 要素を使用して定義されます。これらには以下のようにアノテーションが付けられます。

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

    例35.2「all 複合型のマッピング」に、2 つの要素を持つ all 複合型のマッピングを示します。

    例35.2 all 複合型のマッピング

    @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 複合型

choice 複合型は、choice 要素を使用して定義されます。これらには以下のようにアノテーションが付けられます。

  • @XmlType アノテーションの propOrder プロパティーは、XML スキーマ定義で表示される順序で要素の名前をリストします。
  • メンバー変数のいずれにもアノテーションは付けられません。

    例35.3「choice 複合型のマッピング」に、2 つの要素を持つ choice 複合型のマッピングを示します。

    例35.3 choice 複合型のマッピング

    @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 複合型

sequence 複合型は、sequence 要素を使用して定義されます。これには以下のようにアノテーションが付けられます。

  • @XmlType アノテーションの propOrder プロパティーは、XML スキーマ定義で表示される順序で要素の名前をリストします。
  • 各要素には @XmlElement アノテーションが付けられます。
  • @XmlElement アノテーションの required プロパティーは true に設定されます。

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

    例35.4 sequence 複合型のマッピング

    @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;
        }
    }