36.2. XML スキーマ anyType タイプの使用

概要

XML スキーマ型 xsd:anyType は、すべての XML スキーマ型のルート型です。すべてのプリミティブは、すべてのユーザー定義の複合型と同様に、この型の派生物です。その結果、xsd:anyType として定義された要素には、XML スキーマプリミティブの形式に加えてスキーマドキュメントで定義された複合型のデータが含まれます。

Java では、最も近い一致する型は Object クラスです。これは、他のすべての Java クラスがサブタイプ化されるクラスです。

XML スキーマでの使用

xsd:anyType 型は、他の XML スキーマ複合型と同様に使用します。element 要素の type 要素の値として使用することができます。他のタイプを定義する基本タイプとしても使用できます。

例36.5「ワイルドカード要素を持つ複合型」 に、xsd:anyType 型の要素が含まれる複合型の例を示します。

例36.5 ワイルドカード要素を持つ複合型

<complexType name="wildStar">
  <sequence>
    <element name="name" type="xsd:string" />
    <element name="ship" type="xsd:anyType" />
  </sequence>
</complexType>

Java へのマッピング

xsd:anyType 型の要素は、Object オブジェクトにマッピングされます。例36.6「ワイルドカード要素の Java 表現」 は、Java クラスへの 例36.5「ワイルドカード要素を持つ複合型」 のマッピングを示しています。

例36.6 ワイルドカード要素の Java 表現

public class WildStar {

    @XmlElement(required = true)
    protected String name;
    @XmlElement(required = true) protected Object ship;

    public String getName() {
        return name;
    }

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

    public Object getShip() { return ship; }

    public void setShip(Object value) { this.ship = value; }
}

このマッピングにより、ワイルドカード要素を表すプロパティーに任意のデータを配置できます。Apache CXF ランタイムは、データのマーシャリングとアンマーシャリングを処理して、使用可能な Java 表現にします。

マーシャリング

Apache CXF が XML データを Java 型にマーシャリングする場合、anyType 要素を既知の JAXB オブジェクトにマーシャリングしようとします。anyType 要素を JAXB で生成されたオブジェクトにマーシャリングできるかどうかを判断するために、ランタイムは要素の xsi:type 属性を調べて、要素内のデータ構築に使用される実際の型を判断します。xsi:type 属性が存在しない場合、ランタイムは、イントロスペクションによって要素の実際のデータ型の特定を試みます。要素の実際のデータ型が、アプリケーションの JAXB コンテキストで認識されている型の 1 つであると判断された場合、要素は適切な型の JAXB オブジェクトにマーシャリングされます。

ランタイムが要素の実際のデータタイプを判別できない場合や、要素の実際のデータ型が既知のタイプではない場合、ランタイムはコンテンツを org.w3c.dom.Element オブジェクトにマーシャルします。次に、DOM APis を使用して要素のコンテンツを操作する必要があります。

アプリケーションのランタイムは通常、そのコントラクトに含まれるスキーマから生成されたすべてのタイプを認識しています。これには、コントラクトの wsdl:types 要素で定義されたタイプ、包含によりコントラクトに追加されたデータタイプ、他のスキーマドキュメントのインポートによりコントラクトに追加されたすべてのタイプが含まれます。「ランタイムマーシャラーへのクラスの追加」 で説明される @XmlSeeAlso アノテーションを使用して、追加の型をランタイムを認識させることもできます。

アンマーシャリング

Apache CXF が Java タイプを XML データにアンマーシャリングする場合、Java データタイプとそれらが表す XML スキーマ構造との間の内部マップを使用して、ワイヤに書き込む XML 構造を決定します。ランタイムがクラスを認識し、クラスを XML スキーマ構造にマッピングできる場合は、データを書き出して xsi:type 属性を挿入し、要素に含まれるデータの型を特定します。データが org.w3c.dom.Element オブジェクトに保存されている場合、ランタイムはオブジェクトによって表される XML 構造を書き込みますが、xsi:type 属性は含まれません。

ランタイムが Java オブジェクトを既知の XML スキーマ構造にマップできない場合、マーシャリング例外が出力されます。「ランタイムマーシャラーへのクラスの追加」 で説明されている @XmlSeeAlso アノテーションを使用して、ランタイムのマッピングに型を追加できます。