Mixed 属性のバインディング サポート

このトピックの対象は、レガシ テクノロジに特定されています。XML Web サービスと XML Web サービス クライアントは以下を使用して作成してください。 Windows Communication Foundation.

.NET Framework では、mixed 属性のバインディングを一部サポートしています。

拡張によって複合型を定義する場合、Xsd.exe ツールは mixed="true" XML 属性を XmlTextAttribute が適用された文字列配列フィールドと同等であると見なします。

説明

mixed 属性は complexType、および complexContent 要素で指定できます。値が true の場合、要素に子要素または本体テキスト (文字どおり、型指定されていない文字データ)、またはその両方の組み合わせが含まれる可能性があることを示しています。

<complexContent>mixed 値は、XML スキーマに従って、<complexType>mixed 値をオーバーライドします。存在する場合、<complexContent> 要素は <complexType> 要素の唯一の子です。

Xsd.exe は次のように、System.Xml.Serialization.XmlTextAttribute 属性を持つ文字列配列フィールドへの mixed 属性に、true 設定を割り当てます。

[System.Xml.Serialization.XmlTextAttribute()]
public string[] Text;

XmlText 属性は、クラス メンバーを本体テキストとしてシリアル化するように XmlSerializer クラスに指示します。バインディングは、クラスから .xsd ファイルを生成するとき、および .xsd ファイルからソースを生成するときの両方の方向で機能します。

拡張による型の派生

XML スキーマの仕様では、拡張による混合コンテンツと要素のみコンテンツの切り替えを禁止しています。

  • XML スキーマは、非混合の子要素を持つ複合型を拡張することによって、混合コンテンツを含む複合型を作成することを禁止しています。

  • 同様に、混合コンテンツを含む複合型を拡張することによって、非混合の子要素を持つ複合型を作成することも禁止しています。

XML スキーマ ドキュメントからソース コードを生成しているとき、Xsd.exe でこれらの無効な拡張のいずれかが検出されると、次の警告が表示されます。

スキーマ検証警告 : 派生型と基本型は同じコンテンツ型を持つ必要があります。

Xsd.exe は同時に、前に説明した XmlText 属性を持つ文字列配列フィールドを、混合コンテンツが導入される派生クラスに配置します。これによって、子孫に混合コンテンツが含まれます。

先祖の複合型が子要素を持ち、子孫の複合型が mixed="true" を指定するとき、この警告が表示されます。先祖の複合型が mixed 属性に対して true 値を指定し、子孫の複合型が <complexContent> または <complexType> 要素のどちらに対しても true 値を明示的に指定しない場合にも、警告が表示されます。

一般的に、アセンブリ内の一連のクラスから XML スキーマ ドキュメントを生成するとき、Xsd.exe は次の要素で mixed 属性を true に設定します。

  • <complexType>: 混合コンテンツが導入される複合型の場合。型は、XmlText 属性を持つ文字列配列フィールドを含むクラスに対応します。このトピックで後述するように、スキーマを有効にするために、データ型が基本の複合型である必要はありません。

  • <complexContent>: 子孫の複合型の場合。

この場合でも、XML スキーマ ドキュメントを処理しているとき、既定の <complexContent mixed="false"> がオーバーライドする必要がある場合は、Xsd.exe は <complexType mixed="true"> を受け入れて、子孫型に継承される混合コンテンツを示します。生成されたコードからの逆変換では、予測されるフォームが次のように復元されます。

<complexType>
    <complexContent mixed="true">
        ...
    </complexContent>
</complexType>

混合コンテンツを派生複合型に導入できる唯一の状況は、基本複合型に子要素が含まれない場合です (属性は含まれます)。ただし、これはラウンドトリップ変換で Xsd.exe が異なる意味を持つ XML スキーマを生成する場合でもあります。

混合コンテンツを導入する派生型は、次のように指定する必要があります。

<complexType>
    <complexContent mixed="true">
        ...
    </complexContent>
</complexType>

逆変換では、Xsd.exe は次の抜粋で示すように mixed="true" の配置を切り替えます。

<complexType mixed="true">
    <complexContent mixed="false">
        ...
    </complexContent>
</complexType>

ここでは、XML スキーマに従って、<complexContent> 要素の false 値は、派生型のコンテンツを非混合として、元の意図と矛盾しないように <complexType> 要素の true 値をオーバーライドすると想定しています。

間違いが発生するのは、混合コンテンツが導入された複合型の場合、Xsd.exe は常に、<complexContent> 要素ではなく、<complexType> 要素で mixed 属性を true に設定するためです。

この場合でも、入力としてこの逆の出力を受け取るとき、XmlText 属性を持つ文字列配列フィールドを対応するクラスのメンバーとすることにより、Xsd.exe は一貫して、派生型を導入された混合コンテンツとして解釈します。前述したように、Xsd.exe は <complexType mixed="true"> を受け入れて、<complexContent mixed="false> がオーバーライドする場合でも、子孫型に継承される混合コンテンツを示します。

制限による型の派生

XML スキーマは、混合コンテンツを持つ複合型の制限により、非混合の要素を持つ複合型の派生を可能にします。ただし、.NET Framework は複合型の制限を認識しません。その代わりに、Xsd.exe は基本クラスから継承される空のクラスを作成します。<restriction> 要素を参照してください。

使用可能なコンテナー要素 : <complexContent><complexType>

参照

リファレンス

System.Xml.Schema.XmlSchemaComplexContent.IsMixed
System.Xml.Schema.XmlSchemaComplexType.IsMixed