35.5. 発生の制約


35.5.1. 発生制約をサポートするスキーマ要素

XML スキーマを使用すると、複合型定義を設定する 4 つの XML スキーマ要素の出現制約を指定できます。

35.5.2. すべての要素の発生制約

XML スキーマ

all 要素で定義された複合型では、all 要素で定義された構造を複数回使用することはできません。ただし、all 要素の minOccurs 属性を 0 に設定することで、all 要素で定義される構造をオプションにすることができます。

Java へのマッピング

all 要素の minOccurs 属性を 0 に設定すると、生成された Java クラスには影響しません。

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 クラスを生成します。

35.5.4. 要素の発生制約

概要

要素要素の minOccurs 属性と maxOccurs 属性を使用して、複雑なタイプで特定の 要素 が表示される回数を指定できます。両方の属性のデフォルト値は 1 です。

minOccurs を 0 に設定

複合型のメンバー要素の minOccurs 属性のいずれかを 0 に設定すると、対応する Java メンバー変数に付けられる @XmlElement アノテーションが変更されます。required プロパティーを true に設定する代わりに、@XmlElement アノテーションの required プロパティーが false に設定されます。

minOccurs が 1 より大きい値に設定されている

XML スキーマでは、要素の minOccurs 属性を複数の値に設定すると、タイプのインスタンスで element 要素を複数回発生させるように指定できます。ただし、生成された Java クラスは XML スキーマ制約をサポートしません。Apache CXF は、minOccurs 属性が設定されていないかのように、サポートする Java メンバー変数を生成します。

maxOccurs が設定されている要素

メンバー要素をコンプレックスタイプのインスタンスで複数回表示するには、要素の maxOccurs 属性を 1 よりも大きい値に設定します。maxOccurs 属性の値を unbounded に設定し、member 要素に無制限の回数を表示できるように指定できます。

コードジェネレーターは、maxOccurs 属性が 1 を超える値に設定されたメンバー要素を List<T> オブジェクトである Java メンバー変数にマッピングします。リストの基本クラスは、要素のタイプを Java にマッピングすることによって決定されます。XML スキーマのプリミティブ型の場合には、ラッパークラスは 「ラッパークラス」 のように使用されます。たとえば、メンバー要素の型が xsd:int の場合、生成されるメンバー変数は List<Integer> オブジェクトになります。

35.5.5. シーケンスの発生制約

概要

デフォルトでは、sequence 要素の内容は、複合型のインスタンスで 1 回のみ表示されます。その minOccurs 属性およびその maxOccurs 属性を使用して、sequence 要素で定義された要素のシーケンスが表示を許される回数を変更することができます。これらの属性を使用して、複合型のインスタンスでシーケンス型が 0 回から無制限に発生する可能性があることを指定できます。

XML スキーマの使用

minOccurs 属性は、定義された複合型のインスタンスでシーケンスが発生しなければならない最小回数を指定します。その値は任意の正の整数にすることができます。minOccurs 属性を 0 に設定すると、シーケンスがコンプレックスタイプのインスタンス内で表示されないことを示しています。

maxOccurs 属性は、定義されたコンプレックスタイプのインスタンスでシーケンスが発生する回数の上限を指定します。この値には、ゼロ以外の正の整数または unbounded を設定できます。maxOccurs 属性を unbounded に設定すると、シーケンスが無限に見えるようになります。

例35.20「発生制約のあるシーケンス」に、シーケンスの発生の制約が設定された sequence 型の定義 CultureInfo を示します。シーケンスは 0 から 2 回繰り返すことができます。

例35.20 発生制約のあるシーケンス

<complexType name="CultureInfo">
  <sequence minOccurs="0" maxOccurs="2">
    <element name="Name" type="string"/>
    <element name="Lcid" type="int"/>
  </sequence>
</complexType>

Java へのマッピング

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

Java クラスのメンバー変数の名前は、メンバー要素の名前を連結することにより引き出されます。要素名は And で区切られ、変数名の最初の文字が小文字に変換されます。たとえば、例35.20「発生制約のあるシーケンス」 から生成されたメンバー変数の名前は nameAndLcid になります。

リストに格納されるオブジェクトのタイプは、メンバー要素の型間の関係によって異なります。以下に例を示します。

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

生成された Java クラスには、メンバー変数のゲッターメソッドのみがあります。getter メソッドは、ライブリストへの参照を返します。返されたリストに加えられた変更は、実際のオブジェクトに影響します。

Java クラスは @XmlType アノテーションで禁止されています。アノテーションの name プロパティーは、XML Schema 定義の親要素の name 属性の値に設定されます。アノテーションの propOrder プロパティーには、シーケンス内の要素を表す単一のメンバー変数が含まれます。

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

例35.21「発生制約のあるシーケンスの Java 表現」 は、例35.20「発生制約のあるシーケンス」 で定義された XML スキーマシーケンスの Java マッピングを示します。

例35.21 発生制約のあるシーケンスの Java 表現

@XmlType(name = "CultureInfo", propOrder = {
    "nameAndLcid"
})
public class CultureInfo {

    @XmlElements({
        @XmlElement(name = "Name", type = String.class),
        @XmlElement(name = "Lcid", type = Integer.class)
    })
    protected List<Serializable> nameAndLcid;

    public List<Serializable> getNameAndLcid() {
        if (nameAndLcid == null) {
            nameAndLcid = new ArrayList<Serializable>();
        }
        return this.nameAndLcid;
    }

}

minOccurs を 0 に設定

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

Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.