Menu Close

35.6. モデルグループの使用

概要

XML スキーマのモデルグループは、ユーザー定義の複合型から要素のグループを参照できる便利なショートカットです。たとえば、アプリケーションの複数の型に共通する要素のグループを定義し、グループを繰り返し参照することができます。モデルグループは group 要素を使用して定義され、複合型の定義に似ています。モデルグループから Java へのマッピングも、複合型のマッピングに似ています。

XML スキーマでのモデルグループの定義

group 要素と name 属性を使用して、XML スキーマでモデルグループを定義します。name 属性の値は、スキーマ全体でグループを参照するのに使用される文字列です。complexType 要素などの group 要素は、直接の子要素としてsequence 要素、all 要素、または choice 要素を持つことができます。

子要素内で、element 要素を使用してグループのメンバーを定義します。グループのメンバーごとに、1 つの element 要素を指定します。グループメンバーは、minOccursmaxOccurs を含む element 要素の任意の標準属性を使用できます。そのため、グループに 3 つの要素があり、その 1 つが最大 3 回発生できる場合は、グループに 3 つの element 要素を定義し、そのうちの 1 つには maxOccurs="3" を使用します。例35.22「XML スキーマのモデルグループ」に、3 つの要素を持つモデルグループを示します。

例35.22 XML スキーマのモデルグループ

<group name="passenger">
  <sequence>
    <element name="name" type="xsd:string" />
    <element name="clubNum" type="xsd:long" />
    <element name="seatPref" type="xsd:string"
             maxOccurs="3" />
  </sequence>
</group>

型定義でのモデルグループの使用

モデルグループを定義したら、複合型定義の一部として使用できます。複合型の定義でモデルグループを使用するには、group 要素と ref 属性を使用します。ref 属性の値は、グループの定義時に指定した名前です。たとえば、例35.22「XML スキーマのモデルグループ」で定義されたグループを使用するには、例35.23「モデルグループを使用する複合型」にあるように <group ref="tns:passenger" /> を使用します。

例35.23 モデルグループを使用する複合型

<complexType name="reservation">
  <sequence>
    <group ref="tns:passenger" />
    <element name="origin" type="xsd:string" />
    <element name="destination" type="xsd:string" />
    <element name="fltNum" type="xsd:long" />
  </sequence>
</complexType>

モデルグループが型の定義で使用されると、グループは型のメンバーになります。そのため、reservation のインスタンスには 4 つのメンバー要素があります。最初の要素は passenger 要素で、例35.22「XML スキーマのモデルグループ」に示すグループで定義されるメンバー要素が含まれます。reservation のインスタンスの例は、例35.24「モデルグループを使用する型のインスタンス」に記載されています。

例35.24 モデルグループを使用する型のインスタンス

<reservation>
  <passenger> <name>A. Smart</name> <clubNum>99</clubNum> <seatPref>isle1</seatPref> </passenger>
  <origin>LAX</origin>
  <destination>FRA</destination>
  <fltNum>34567</fltNum>
</reservation>

Java へのマッピング

デフォルトでは、モデルグループは複合型の定義に含まれる場合にのみ Java アーティファクトにマッピングされます。モデルグループが含まれる複合型のコードを生成する場合、Apache CXF は、単に型用に生成された Java クラスにモデルグループのメンバー変数を追加します。モデルグループを表すメンバー変数には、モデルグループの定義に基づいてアノテーションが付けられます。

例35.25「グループが設定された型」に、例35.23「モデルグループを使用する複合型」で定義される複合型に対して生成された Java クラスを示します。

例35.25 グループが設定された型

@XmlType(name = "reservation", propOrder = {
    "name",
    "clubNum",
    "seatPref",
    "origin",
    "destination",
    "fltNum"
})
public class Reservation {

    @XmlElement(required = true)
    protected String name;
    protected long clubNum;
    @XmlElement(required = true)
    protected List<String> seatPref;
    @XmlElement(required = true)
    protected String origin;
    @XmlElement(required = true)
    protected String destination;
    protected long fltNum;

    public String getName() {
        return name;
    }

    public void setName(String value) {
        this.name = value;
    }

    public long getClubNum() {
        return clubNum;
    }

    public void setClubNum(long value) {
        this.clubNum = value;
    }

    public List<String> getSeatPref() {
        if (seatPref == null) {
            seatPref = new ArrayList<String>();
        }
        return this.seatPref;
    }

    public String getOrigin() {
        return origin;
    }

    public void setOrigin(String value) {
        this.origin = value;
    }

    public String getDestination() {
        return destination;
    }

    public void setDestination(String value) {
        this.destination = value;
    }

    public long getFltNum() {
        return fltNum;
    }

    public void setFltNum(long value) {
        this.fltNum = value;
    }

複数回の発生

group 要素の maxOccurs 属性を 1 より大きい値に設定すると、モデルグループが複数回表示されるように指定できます。モデルグループが複数回発生することを許可するために、Apache CXF はモデルグループを List<T> オブジェクトにマッピングします。List<T> オブジェクトは、グループの最初の子のルールに従って生成されます。