35.2. 属性

概要

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

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

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

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

XML Schema 属性 要素には、属性の特定に使用される必須の属性である name が 1 つあります。また、表35.2「XML スキーマで属性を定義するために使用されるオプションの属性」 で説明されている 4 つのオプションの属性があります。

表35.2 XML スキーマで属性を定義するために使用されるオプションの属性

属性説明

use

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

type

属性が取ることができる値のタイプを指定します。使用しない場合は、属性のスキーマタイプをインラインで定義する必要があります。

default

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

固定:

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

例35.5「XML スキーマの定義と属性」 は、値が文字列である属性通貨を定義する属性要素を示しています。

例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>

type 要素から attribute 属性が省略された場合、データの形式をインラインで記述する必要があります。例35.6「インラインデータの説明を含む属性」 は、autobiographynon-fictionfiction のいずれかの値を取ることができる category という属性を持つ attribute 要素を示しています。

例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. 複合型の定義で属性グループを使用します。

    attributeGroup 属性とともに ref 要素を使用して、複合型定義で属性グループを使用します。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 Description」 で定義された複合型に示す 例35.10「techDocJava クラス」 は Java クラスにマップされます。

例35.9 techDoc Description

<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 techDocJava クラス

@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「techDocJava クラス」 にあるように、default 属性と fixed 属性は、コードジェネレーターに対し、属性用に生成されたジッターメソッドにコードを追加するよう指示します。この追加コードは、値が設定されていない場合に指定された値が返されることを保証します。

重要

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

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

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

例35.11 dvdType Java Class

@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;
    }

}