1. ホーム
  2. xml

[解決済み】XML-スキーマでxsi:typeを属性として定義する方法とは?

2022-02-20 10:18:43

質問

スキーマ定義を書きたいXMLがあります。問題は,属性としてxsi:typeをどのように定義すればよいのかがわからないことです.以下はそのXML要素です.

<SerializedData xsi:type="xs:double">300.0</SerializedData>

これまでの私のXML-スキーマの定義は次のようなものです。

<complexType name="SerializedDataType">
    <simpleContent>
        <extension base="double">

        </extension>
    </simpleContent>
</complexType>

Ian Robertsが提案したような定義も試してみました。

<element name="SerializedData"/>

しかし、BPELデザイナーを使って初期化すると、このようになります。

<SerializedData xsi:type="xs:double">300.0</SerializedData>

次のような警告が表示されます。

入力された固定値は有効なXMLではないようです(ある種の固定値が正しく動作するために必要です)。テキスト形式で保存されます。

このように初期化しても警告が出ないのですが。

<SerializedData>300.0</SerializedData>

しかし、問題は、私が呼び出そうとしているWebサービスが、リクエストSOAPメッセージにxsi:type="xs:double"という属性が含まれることを期待していることです。どうすれば、この属性を含むSOAPリクエスト・メッセージを作成できるでしょうか?

どんなことでもご相談ください。

解決方法は?

その必要はありません。型なしで要素を宣言するだけです。

<element name="SerializedData" />

xsi:type 属性は、ある要素の特定のインスタンスの実際の型が、その要素の宣言された型ではなく、宣言された型から派生したサブタイプであることをスキーマバリデータに示すために使用されます。要素を型なしで宣言することにより、その要素は 任意の 型を使用することになり xsi:type をインスタンスで指定します。

厳密には、XML Schema の型階層のルートである "ur-type" を型とする要素を宣言しているのですが、単純なものも複雑なものも、最終的にはすべて ur-type から派生します。もしあなたが SerializedData 要素を単純な内容のみにする(サブ要素や属性を付けない)には、次のように宣言します。

<element name="SerializedData" type="anySimpleType" />

ご質問の後半部分についてですが、あなたのデザイナー・ツールは、単独では正しく

<SerializedData xsi:type="xs:double">300.0</SerializedData>

は正しい XML ではありません。 xsi 名前空間が宣言されていません。名前空間の宣言を追加してみてください。

<SerializedData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xsi:type="xs:double">300.0</SerializedData>