35.5.3. 選択要素の発生制約
概要
デフォルトでは、choice
要素の結果は、コンプレックスタイプのインスタンスで 1 回のみ表示されます。choice
要素で定義された構造を表現するために選ばれた要素の出現回数は、minOccurs
属性と mxOccurs
属性で変更することができます。これらの属性を使用して、複合型のインスタンスで選択型が 0 回から無制限に発生する可能性があることを指定できます。選択タイプ用に選択された要素は、タイプの出現ごとに同じである必要はありません。
XML スキーマでの使用
minOccurs
属性は、選択タイプを表示する必要のある最小回数を指定します。その値は任意の正の整数にすることができます。minOccurs
属性を 0
に設定すると、選択タイプはコンプレックスタイプのインスタンス内で表示する必要がないことを意味します。
maxOccurs
属性は、選択タイプを表示できる最大回数を指定します。この値には、ゼロ以外の正の整数または unbounded
を設定できます。maxOccurs
属性を unbounded
に設定すると、選択タイプが無限の回数を表示できることを示します。
例35.18「発生の制約の選択」に、choice の発生の制約が設定された choice 型の定義 ClubEvent
を示します。全体的な選択タイプは、0 から無制限の時間まで繰り返すことができます。
例35.18 発生の制約の選択
<complexType name="ClubEvent"> <choice minOccurs="0" maxOccurs="unbounded"> <element name="MemberName" type="xsd:string"/> <element name="GuestName" type="xsd:string"/> </choice> </complexType>
Java へのマッピング
単一インスタンス選択構造とは異なり、複数回発生する可能性のある XML スキーマ選択構造は、単一のメンバー変数を使用して Java クラスにマップされます。この単一メンバー変数は、シーケンスの複数の発生に対するすべてのデータを保持する List<T>
オブジェクトです。たとえば、例35.18「発生の制約の選択」 で定義されたシーケンスが 2 回発生した場合、リストには 2 つの項目が含まれます。
Java クラスのメンバー変数の名前は、メンバー要素の名前を連結することにより引き出されます。要素名は Or
で区切られ、変数名の最初の文字は小文字に変換されます。例えば、例35.18「発生の制約の選択」 から生成されるメンバー変数の名前は memberNameOrGuestName
となります。
リストに格納されるオブジェクトのタイプは、メンバー要素の型間の関係によって異なります。以下に例を示します。
-
メンバー要素が同じタイプの場合は、生成されたリストに
JAXBElement<T>
オブジェクトが含まれます。JAXBElement<T>
オブジェクトのベースタイプは、メンバー要素のタイプの通常のマッピングによって決定されます。 - メンバー要素が異なる型であり、それらの Java 表現が共通のインターフェイスを実装している場合、リストには共通のインターフェイスのオブジェクトが含まれます。
- メンバー要素が異なる型であり、それらの Java 表現が共通のベースクラスを拡張している場合、リストには共通のベースクラスのオブジェクトが含まれます。
-
他の条件が満たされていない場合は、リストに
Object
オブジェクトが含まれます。
生成された Java クラスには、メンバー変数のゲッターメソッドのみが含まれます。getter メソッドは、ライブリストへの参照を返します。返されたリストに変更を加えると、実際のオブジェクトに影響します。
Java クラスは @XmlType
アノテーションで禁止されています。アノテーションの name
プロパティーは、XML Schema 定義の親要素の name
属性の値に設定されます。アノテーションの propOrder
プロパティーには、シーケンス内の要素を表す単一のメンバー変数が含まれます。
choice 構造の要素を表すメンバー変数には、@XmlElements
アノテーションが付けられます。@XmlElements
アノテーションには、@XmlElement
アノテーションのコンマ区切りリストが含まれます。このリストには、型の XML スキーマ定義で定義されたメンバー要素ごとに @XmlElement
アノテーションが 1 つ含まれます。リストの @XmlElement
アノテーションは、name
プロパティーが XML Schema element
エレメントの name
属性の値に設定され、type
プロパティーが XML Schema element
エレメントのタイプをマッピングした結果の Java クラスに設定されています。
例35.19「発生制約のある選択構造の Java 表現」 は、例35.18「発生の制約の選択」 で定義されている XML スキーマ選択構造の Java マッピングを示しています。
例35.19 発生制約のある選択構造の 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; } }
minOccurs を 0 に設定
minOccurs
要素のみが指定され、その値が 0
の場合、コードジェネレーターは minOccurs
属性が設定されていないかのように Java クラスを生成します。