Menu Close

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 表現」に、例36.5「ワイルドカード要素を持つ複合型」から Java クラスへのマッピングを示します。

例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 コンテキストによって認識される型のいずれかであると判断された場合、要素は適切な型の JAXB オブジェクトにマーシャリングされます。

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

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

アンマーシャリング

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

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