Menu Close

35.2. 属性

概要

Apache CXF は、complexType 要素の範囲内の attribute 要素および attributeGroup 要素の使用をサポートします。XML ドキュメントの構造を定義する場合、属性宣言により、タグに含まれる値ではなくタグ内で指定される情報を追加することができます。たとえば、XML スキーマで XML 要素 <value currency="euro">410<\value> を記述する場合、currency 属性は 例35.5「XML スキーマの定義および属性」に示すように attribute 要素を使用して記述されます。

attributeGroup 要素により、スキーマで定義されたすべての複合型で参照できる再利用可能な属性のグループを定義できます。たとえば、属性 category および pubDate を使用する一連の要素を定義する場合、これらの属性で属性グループを定義してそれらを使用するすべての要素で参照することができます。これは 例35.7「属性グループの定義」に示されています。

アプリケーションロジックの開発で使用するデータ型を記述する場合、use 属性が optional または required のいずれかに設定されている属性は構造の要素として処理されます。複合型の記述内に含まれる各属性宣言に対して、適切なゲッターおよびセッターメソッドと共に、属性のクラスに要素が生成されます。

XML スキーマでの属性の定義

XML スキーマの attribute 要素には、属性の特定に使用される 1 つの必須属性 name があります。また、表35.2「XML スキーマでの属性の定義に使用される任意の属性」で説明されている 4 つの任意の属性もあります。

表35.2 XML スキーマでの属性の定義に使用される任意の属性

属性説明

use

属性が必要であるかどうかを指定します。有効な値は requiredoptional、または prohibited です。optional がデフォルト値です。

type

属性に設定できる値の型を指定します。この属性が使用されない場合、属性のスキーマ型をインラインで定義する必要があります。

default

属性に使用するデフォルト値を指定します。attribute 要素の use 属性が optional に設定されている場合にのみ使用されます。

fixed

属性に使用する固定値を指定します。attribute 要素の use 属性が optional に設定されている場合にのみ使用されます。

例35.5「XML スキーマの定義および属性」に、値が文字列である属性 currency を定義する属性要素を示します。

例35.5 XML スキーマの定義および属性

<element name="value">
  <complexType>
    <xsd:simpleContent>
      <xsd:extension base="xsd:integer">
        <xsd:attribute name="currency" type="xsd:string"
                       use="required"/>
      </xsd:extension>
    </xsd:simpleContent>
  </xsd:complexType>
</xsd:element>

attribute 要素から type 属性が省略された場合、データの形式をインラインで記述する必要があります。例35.6「インラインデータ記述による属性」に、autobiographynon-fiction、または fiction の値を取る属性 categoryattribute 要素を示します。

例35.6 インラインデータ記述による属性

<attribute name="category" use="required">
  <simpleType>
    <restriction base="xsd:string">
      <enumeration value="autobiography"/>
      <enumeration value="non-fiction"/>
      <enumeration value="fiction"/>
    </restriction>
  </simpleType>
</attribute>

XML スキーマでの属性グループの使用

複合型定義での属性グループの使用は、以下の 2 ステップのプロセスです。

  1. 属性グループを定義します。

    属性グループは、多くの attribute 子要素を持つ attributeGroup 要素を使用して定義されます。attributeGroup には、属性グループの参照に使用される文字列を定義する name 属性が必要です。attribute 要素は属性グループのメンバーを定義し、「XML スキーマでの属性の定義」で示されているように指定されます。例35.7「属性グループの定義」に、属性グループ catalogIndecies の記述を示します。属性グループには、category (任意) および pubDate (必須) の 2 つのメンバーが含まれます。

    例35.7 属性グループの定義

    <attributeGroup name="catalogIndices">
      <attribute name="category" type="catagoryType" />
      <attribute name="pubDate" type="dateTime"
                 use="required" />
    </attributeGroup>
  2. 複合型の定義で属性グループを使用します。

    ref 属性と共に attributeGroup 要素を使用して、複合型定義で属性グループを使用します。ref 属性の値は、型定義の一部として使用する属性グループの名前です。たとえば、複合型 dvdType で属性グループ catalogIndecies を使用する場合は、例35.8「属性グループを使用した複合型」に示されるように <attributeGroup ref="catalogIndecies" /> を使用します。

    例35.8 属性グループを使用した複合型

    <complexType name="dvdType">
      <sequence>
        <element name="title" type="xsd:string" />
        <element name="director" type="xsd:string" />
        <element name="numCopies" type="xsd:int" />
      </sequence>
      <attributeGroup ref="catalogIndices" />
    </complexType>

Java への属性のマッピング

属性は、メンバー要素が Java にマッピングされるのと同じ方法で Java にマッピングされます。必須属性および任意の属性は、生成される Java クラスのメンバー変数にマッピングされます。メンバー変数には @XmlAttribute アノテーションが付けられます。属性が必須な場合、@XmlAttribute アノテーションの required プロパティーは true に設定されます。

例35.9「techDoc の記述」で定義される複合型は、例35.10「techDoc Java クラス」に示されている Java クラスにマッピングされます。

例35.9 techDoc の記述

<complexType name="techDoc">
  <all>
    <element name="product" type="xsd:string" />
    <element name="version" type="xsd:short" />
  </all>
  <attribute name="usefullness" type="xsd:float"
             use="optional" default="0.01" />
</complexType>

例35.10 techDoc Java クラス

@XmlType(name = "techDoc", propOrder = {

})
public class TechDoc {

    @XmlElement(required = true)
    protected String product;
    protected short version;
    @XmlAttribute protected Float usefullness;

    public String getProduct() {
        return product;
    }

    public void setProduct(String value) {
        this.product = value;
    }

    public short getVersion() {
        return version;
    }

    public void setVersion(short value) {
        this.version = value;
    }

    public float getUsefullness() { if (usefullness == null) { return 0.01F; } else { return usefullness; } }

    public void setUsefullness(Float value) {
        this.usefullness = value;
    }
}

例35.10「techDoc Java クラス」にあるように、default 属性と fixed 属性は、コードジェネレーターに対し、属性用に生成されたジッターメソッドにコードを追加するよう指示します。この追加コードにより、値が設定されないと、指定された値が返されます。

重要

fixed 属性は default 属性と同じように扱われます。fixed 属性を Java 定数として処理させる場合は、「固定値属性マッピングのカスタマイズ」に記載のカスタマイズを使用できます。

属性グループの Java へのマッピング

属性グループは、グループのメンバーが型定義で明示的に使用されているかのように Java にマッピングされます。属性グループに 3 つのメンバーがあり、複合型で使用されている場合、その型に生成されたクラスには、ジッターおよびセッターメソッドと共に、属性グループのメンバーごとにメンバー変数が含まれます。たとえば、例35.8「属性グループを使用した複合型」で定義される複合型の場合、例35.11「dvdType Java クラス」に示されているように、属性グループのメンバーをサポートするために、Apache CXF はメンバー変数 categorypubDate が含まれるクラスを生成します。

例35.11 dvdType Java クラス

@XmlType(name = "dvdType", propOrder = {
    "title",
    "director",
    "numCopies"
})
public class DvdType {

    @XmlElement(required = true)
    protected String title;
    @XmlElement(required = true)
    protected String director;
    protected int numCopies;
    @XmlAttribute protected CatagoryType category; @XmlAttribute(required = true) @XmlSchemaType(name = "dateTime") protected XMLGregorianCalendar pubDate;

    public String getTitle() {
        return title;
    }

    public void setTitle(String value) {
        this.title = value;
    }

    public String getDirector() {
        return director;
    }

    public void setDirector(String value) {
        this.director = value;
    }

    public int getNumCopies() {
        return numCopies;
    }

    public void setNumCopies(int value) {
        this.numCopies = value;
    }

    public CatagoryType getCatagory() {
        return catagory;
    }

    public void setCatagory(CatagoryType value) {
        this.catagory = value;
    }

    public XMLGregorianCalendar getPubDate() {
        return pubDate;
    }

    public void setPubDate(XMLGregorianCalendar value) {
        this.pubDate = value;
    }

}