次の方法で共有


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

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

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

Xsd.exe では、minOccurs 属性の値をチェックするのは <element> 要素だけであり、チェックするのは MaxOccurs 属性のバインディング サポート 属性の値が配列フィールドを決定しない場合に限られます。そのため、対応するフィールドに参照型と値型のどちらがあるかなどのさまざまな要因に従って、値が解釈 (または生成) されます。

説明

minOccurs 属性および maxOccurs 属性は、指定したエントリが XML インスタンス ドキュメント内の対応位置に連続して出現できる回数を制限します。

これらの属性は、複合型定義でのみ使用できます。そのため、<element> 要素または <group> 要素の場合、要素はグローバル宣言そのものではなく、グローバル宣言への参照またはローカル宣言である必要があります。

XML スキーマ複合型と非 XML 固有クラスのバインディングに関して、.NET Framework には、minOccurs 属性または maxOccurs 属性と等価な直接プログラミング言語が用意されていません。

XSD からソースへの変換

XML スキーマ ドキュメントからソース コードを生成するとき、Xsd.exe は、<choice><sequence><group><all><any> の各要素に適用される minOccurs 属性を無視します。

<element> 要素に対しては、maxOccurs 属性の値が 1 よりも大きいか unbounded である場合に、Xsd.exe は minOccurs 属性を無視します。この場合、ツールによって XSD データ型に対応する型の配列が生成されます。Xsd.exe では、単一インスタンスと配列のどちらを生成するかを決定するために、maxOccurs 属性の値を使用します。

<element> 要素については、スキーマ データ型が .NET Framework 参照型に変換される場合、minOccurs 属性がそのスキーマ データ型に適用されるときにも、この属性を無視します。

Xsd.exe で minOccurs 属性の値が使用されるのは、次の条件をすべて満たす場合に限られます。

  • <element> 要素が含まれている。

  • maxOccurs 属性によって、単一のインスタンスに決定される。

  • データ型が値型に変換される。

ツールは、この値を次のように解釈します。

  • 1 or more: Xsd.exe はパブリック フィールドを生成します。XML 関連の属性は適用されないため、既定の System.Xml.Serialization.XmlElementAttribute が使用されます。

  • 0: Xsd.exe はパブリック フィールドを生成します。XML 関連の属性は適用されないため、既定の XmlElementAttribute が使用されます。さらに、Xsd.exe は bool 型のパブリック フィールドを生成します。このフィールドの名前は、要素のフィールドの名前に Specified を追加した名前になります。たとえば要素フィールドの名前が startDate である場合、bool フィールドの名前は startDateSpecified になります。オブジェクトを XML にシリアル化すると、要素を書き込むかどうかを判断するために、XmlSerializer クラスは bool フィールドの値をチェックします。XmlSerializer でシリアル化されないようにするには、bool フィールドを System.Xml.Serialization.XmlIgnoreAttribute と共に使用します。

配列バインディングの詳細。定義が正確でないと、maxOccurs 属性の値で配列バインディングが決定されても、Xsd.exe は minOccurs 属性を無視します。生成された配列から新規 <element> 宣言への逆変換では、元の minOccurs 値が生成されず、値 0unboundedmaxOccurs 値が生成されます。

配列への型バインディングを理解するために、特定の型のオブジェクトを宣言することと、そのオブジェクトに値 (文字どおり、スタックまたはヒープ内のメモリ位置) を割り当てることの違いを説明します。次の XSD 要素を考えます。

<xsd:element minOccurs="5" maxOccurs="5" name="items" type="xsd:token" />

手動でコードを作成する場合は、public string[] items のように、型宣言時には配列サイズ 5 を表明しません。その代わり、items = new string[5] のように、値の割り当て時に配列のサイズを表明します。

Xsd.exe が XML スキーマから生成するソース コードの種類は、型宣言、フィールド宣言、および型やフィールドに属性として適用できるメタデータだけです。オブジェクトに値を割り当てると、そのスコープを超えて拡張されます。

1 よりも大きい値にする場合は、スキーマ オブジェクト モデル (SOM: Schema Object Model) で表された XML スキーマ ドキュメントに対して、XML ドキュメントを XmlValidatingReader クラスを使用して検証します。SOM では、System.Xml.Schema.XmlSchemaParticle.MinOccurs プロパティおよび System.Xml.Schema.XmlSchemaParticle.MinOccursString プロパティを使用します。これらのプロパティは、minOccurs 属性を設定できるすべての要素に適用されます。

Xsd.exe が出現制約を処理する方法の詳細については、maxOccurs 属性を参照してください。

ソースから XSD への変換

クラスから XML スキーマ ドキュメントを生成するときに Xsd.exe が生成する minOccurs 値は、生成される XML スキーマ定義言語の要素によって異なります。使用可能な要素と、それに伴う minOccurs の動作を次に示します。

<choice>: choice が単一のオブジェクトを表す場合は 1、配列を表す場合は 0 になります。

<sequence>: 指定しない場合は、既定の 1 に逆変換されます。

<group>: Xsd.exe はソースから <group> 要素を生成しません。

<all>: Xsd.exe はソースから <all> 要素を生成しません。

<any>: <element> 要素を説明する規則のとおり、0 になります。<any> 要素については、このトピックの後半で説明します。

<element>: フィールドやプロパティは配列と単体インスタンスのどちらなのか、フィールドやプロパティは値型と参照型のどちらなのか、値型なら既定値と、値が指定されたかどうかを示す追加フィールドのどちらであるか、参照型なら IsNullable プロパティが true に設定された XML 関連属性に割り当てられているかどうかなどによって、Xsd.exe が生成する minOccurs の値は変わります。

IsNullable プロパティは、特定の XML 関連属性クラスで使用されます。このプロパティは、次のように現れます。

クラス メンバーの IsNullable プロパティが true に設定され、オブジェクトが null 参照 (Visual Basic では Nothing) に設定された場合、XmlSerializer クラスは xsi:nil 属性を値 true で生成します。プレフィックス xsi は、XML スキーマ インスタンス名前空間 (http://www.w3.org/2001/XMLSchema-instance) に対して使用されます。

インスタンス ドキュメント内の要素に xsi:nil="true" があるということは、その要素に内容 (子要素と本文テキストのどちらも) がないことを明示的に表しています。xsi:nil 属性を参照してください。

IsNullable プロパティは、XML スキーマ定義言語の nillable 属性に対応します。クラスから XSD 定義を生成中に、クラスまたはメンバーの IsNullable プロパティで true 値が出現し、かつ、型が null 参照に割り当て可能な場合、対応する XSD <element> 要素に nillable="true" 設定が生成されます。nillable 属性を参照してください。

単一インスタンスのクラス メンバーに対応する minOccurs 属性の値を決定する規則を次の表に示します。配列の場合もこれらの規則に従いますが、このトピックで後述する例外が 1 つあります。表は、関連クラス メンバーの種類と minOccurs の結果値で分類しています。

入力クラス メンバー

出力 <element> 要素の minOccurs 値

System.Component.DefaultValueAttribute で指定された既定値の値型。

0<element> 要素では、既定値は default XML 属性を使用して指定されることもあります。

「XSD からソースへの変換」にある Specified 名前付け規則を使用する bool パブリック フィールドに伴う値型。

0

既定値または伴う boolean フィールドのない値型。

1

XmlElement 属性の IsNullable プロパティが true に設定された参照型。

1<element> 要素では、nillable 属性も true に設定されます。

IsNullable 設定がないか、または IsNullable=false である参照型。

0

Xsd.exe では、XML スキーマ ドキュメントからソース コードへの逆変換時にも、これらの識別機能を維持します。

注 : default XML 属性が現れ、minOccurs 属性が 0 に設定されている場合、かつデータ型が値型に割り当てられている場合、DefaultValue 属性だけが生成されます。伴う boolean フィールドは生成されません。default 属性も参照してください。

たとえば、次の要素が入力ソース ファイルに出現するとします。

<xsd:element name="birthdate" type="xsd:date" default="2002-03-04" minOccurs="0" />Xsd.exe would then produce: 
[System.Xml.Serialization.XmlElementAttribute(DataType="date")]
[System.ComponentModel.DefaultValueAttribute(typeof(System.DateTime), "2002-03-04")]
public System.DateTime birthdate = new System.DateTime(631507968000000000);

**配列のバインディング。**Xsd.exe は、次の配列形式で <element> 宣言を常に生成します。

<element minOccurs="0" maxOccurs="unbounded" />

これは、配列型が参照型であるため、正しい宣言です。ただし、その他の配列型とは異なり、配列メンバーに次の属性宣言が適用される場合でも正しくなります。

[XmlElementAttribute(IsNullable=true)]

XmlElement 属性が既定の XmlArrayAttribute に代わって配列に適用されると、配列要素は、クラスにバインドされた要素の子としてインスタンス ドキュメントに出現します。配列要素の親として厳密に機能するように導入される追加要素はありません。Xsd.exe は nillable="true" である要素を生成することで IsNullable=true を認識しますが、minOccurs 値は 0 のまま生成され、配列要素は依然として含まれない場合があります。

既定の XmlArray 属性が適用される場合、配列の親要素を表すために、名前が ArrayOf で始まるスキーマ データ型が作成されます。配列のバインディングの詳細については、maxOccurs 属性に関するトピック、および「属性を使用した XML シリアル化の制御」を参照してください。

親要素のスキーマ データ型は参照型に対応するため、Xsd.exe ではこのスキーマ データ型を minOccurs 値が生成されたかのように扱います。つまり、次のように IsNullable プロパティが true に設定されると、minOccurs 値は 1 で生成されます。

[System.Xml.Serialization.XmlArrayAttribute(IsNullable=true)]

それ以外の場合、minOccurs 値は 0 で生成されます。

<any> 要素。単一オブジェクトと配列のどちらが関係するかにかかわらず、Xsd.exe が <any> 要素に対して minOccurs="0" を生成するのは、等価なコード コンストラクターが参照型であるためです。その構成要素は、System.Xml.XmlElement 型のフィールド (またはその配列)、および System.Xml.Serialization.XmlAnyElementAttribute 属性です。属性宣言 [XmlElementAttribute(IsNullable=true)]XmlElement オブジェクトまたは配列に適用できますが、Xsd.exe はこの使用法を minOccurs="1" の場合の <any> 要素として解釈しません。

使用可能な子要素 : <all><any><choice><element><group><sequence>

参照

リファレンス

System.Xml.Schema.XmlSchemaParticle.MinOccurs
System.Xml.Schema.XmlSchemaParticle.MinOccursString
XmlSchemaAll
XmlSchemaAny
XmlSchemaChoice
XmlSchemaElement
XmlSchemaGroupRef
XmlSchemaSequence