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.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「インラインデータの説明を含む属性」 は、autobiography
、non-fiction
、fiction
のいずれかの値を取ることができる 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 段階のプロセスです。
属性グループを定義します。
属性グループは、多くの
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>
複合型の定義で属性グループを使用します。
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 はメンバー変数 category
と pubDate
が含まれるクラスを生成します。
例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;
}
}