Menu Close

35.5.3. choice 要素での発生の制約

概要

デフォルトでは、choice 要素の結果は、複合型のインスタンスで 1 回のみ表示されます。その minOccurs 属性およびその mxOccurs 属性を使用して、choice 要素で定義された構造を表すために選択した要素が表示を許される回数を変更することができます。これらの属性を使用すると、choice 型の複合型インスタンスでの発生回数をゼロから無制限に指定することができます。choice 型用に選択した要素は、各型の発生用の要素と同じである必要はありません。

XML スキーマでの使用

minOccurs 属性は、choice 型が表示されなければならない最小回数を指定します。この値は、任意の正の整数にすることができます。minOccurs 属性を 0 に設定すると、choice 型が複合型のインスタンスに表示される必要がないことを指定します。

maxOccurs 属性は、choice 型を表示できる最大回数を指定します。この値には、ゼロ以外の正の整数または unbounded を設定できます。maxOccurs 属性を unbounded に設定すると、choice 型を無制限に表示可能であることを指定します。

例35.18「choice の発生の制約」に、choice の発生の制約が設定された choice 型の定義 ClubEvent を示します。全体で、choice 型を 0 回から無限回繰り返すことができます。

例35.18 choice の発生の制約

<complexType name="ClubEvent">
  <choice minOccurs="0" maxOccurs="unbounded">
    <element name="MemberName" type="xsd:string"/>
    <element name="GuestName" type="xsd:string"/>
  </choice>
</complexType>

Java へのマッピング

単一インスタンスの choice 構造とは異なり、複数回発生できる XML スキーマの choice 構造は、単一のメンバー変数を持つ Java クラスにマッピングされます。この単一メンバー変数は、シーケンスの複数の発生に対するすべてのデータを保持する List<T> オブジェクトです。たとえば、例35.18「choice の発生の制約」で定義されたシーケンスが 2 回発生する場合、リストには 2 つの項目が含まれます。

Java クラスのメンバー変数の名前は、メンバー要素の名前を連結することによって派生されます。要素名は Or で区切られ、変数名の最初の文字が小文字に変換されます。たとえば、例35.18「choice の発生の制約」から生成されたメンバー変数の名前は memberNameOrGuestName になります。

一覧に保存されるオブジェクト型は、メンバー要素の型間の関係によって異なります。以下に例を示します。

  • メンバー要素が同じ型の場合は、生成される一覧には JAXBElement<T> オブジェクトが含まれます。JAXBElement<T> オブジェクトのベース型は、メンバー要素の型の通常のマッピングによって決定されます。
  • メンバー要素が異なる型で、その Java 表現が共通のインターフェースを実装する場合、リストには共通インターフェースのオブジェクトが含まれます。
  • メンバー要素が異なる型で、その Java 表現が共通のベースクラスを拡張する場合、リストには共通ベースクラスのオブジェクトが含まれます。
  • 他の条件のいずれも満たさない場合、リストには Object オブジェクトが含まれます。

生成される Java クラスには、メンバー変数のゲッターメソッドのみが含まれます。ゲッターメソッドは、ライブリストへの参照を返します。返されたリストに対して行った変更は、実際のオブジェクトに影響します。

Java クラスには @XmlType アノテーションが付けられます。アノテーションの name プロパティーは、XML スキーマ定義の親要素からの name 属性の値に設定されます。アノテーションの propOrder プロパティーには、シーケンスの要素を表す単一のメンバー変数が含まれます。

choice 構造の要素を表すメンバー変数には、@XmlElements アノテーションが付けられます。@XmlElements アノテーションには、@XmlElement アノテーションのコンマ区切りリストが含まれます。このリストには、型の XML スキーマ定義で定義されたメンバー要素ごとに @XmlElement アノテーションが 1 つ含まれます。リストの @XmlElement アノテーションの name プロパティーは、XML スキーマの element 要素の name 属性の値に設定され、type プロパティーは、XML スキーマの element 要素の型のマッピングで生じる Java クラスに設定されます。

例35.19「発生の制約が設定された choice 構造の Java 表現」に、例35.18「choice の発生の制約」で定義される XML スキーマの choice 構造の Java マッピングを示します。

例35.19 発生の制約が設定された choice 構造の Java 表現

@XmlType(name = "ClubEvent", propOrder = {
    "memberNameOrGuestName"
})
public class ClubEvent {

    @XmlElementRefs({
        @XmlElementRef(name = "GuestName", type = JAXBElement.class),
        @XmlElementRef(name = "MemberName", type = JAXBElement.class)
    })
    protected List<JAXBElement<String>> memberNameOrGuestName;

    public List<JAXBElement<String>> getMemberNameOrGuestName() {
        if (memberNameOrGuestName == null) {
            memberNameOrGuestName = new ArrayList<JAXBElement<String>>();
        }
        return this.memberNameOrGuestName;
    }

}

0 に設定された minOccurs

minOccurs 要素のみを指定し、その値が 0 の場合、コードジェネレーターは minOccurs 属性が設定されていないかのように Java クラスを生成します。