このトピックの対象は、レガシ テクノロジに特定されています。XML Web サービスと XML Web サービス クライアントは以下を使用して作成してください。 Windows Communication Foundation.
.NET Framework では、xsi:nil 属性のバインディングを一部サポートしています。
XmlSerializer クラスでは、xsi:nil="true"
属性値は、参照型または NULL 許容値型に代入された null 参照と同等であると見なされます。nil 属性に true
を設定した場合、XmlSerializer では、NULL 非許容値型のインスタンスを逆シリアル化しようとしたときに例外がスローされます。NULL 許容型の詳細については、「Nullable Types (C# Programming Guide)」を参照してください。
説明
nil 属性は、XML スキーマ インスタンス名前空間 (http://www.w3.org/2001/XMLSchema-instance) で定義されており (関連付けられているプレフィックスは通常 xsi)、XML スキーマ ドキュメントではなく XML インスタンスのみに適用されます。XML 要素で xsi:nil 属性に true
を指定すると、その要素には子要素か本体テキストかに関係なく、コンテンツが存在しないと明示することになります。
nil 属性は、XSD 宣言に nillable 属性が存在し、この属性に true
が設定されている XML 要素で使用された場合にのみ有効です。オブジェクトまたはメンバーに対応する XML 要素に対して nillable="true"
の設定が適用されているかどうかを .NET Framework で判断する方法については、nillable 属性を参照してください。
XmlSerializer クラスでは、nil 属性の値に true
が設定されていると null 参照 (Visual Basic では Nothing) と同等と見なされ、以下の実行時変換が行われます。
XML ドキュメントをオブジェクトに逆シリアル化している場合 :
xsi:nil="true"
と指定された XML 要素が存在すると、XmlSerializer クラスでは、対応するオブジェクトに null 参照が代入されます (該当する場合)。オブジェクトを XML ドキュメントにシリアル化している場合 : XML 要素に対応するオブジェクトに null 参照があると、XmlSerializer クラスでは、
nillable="true"
の設定が適用してある場合には、xsi:nil="true"
を指定した要素が作成されます。適用してない場合には、この要素全体が除外されます。
nil 属性と NULL 非許容値型
NULL 非許容値型には null 参照を設定できないため、XML 要素宣言にマップされている型のクラス メンバーを XmlSerializer クラスでシリアル化する場合に、対応するインスタンス要素に xsi:nil 属性を出力できません。
XmlSerializer クラスでは、データ型が NULL 非許容値型にマップされていて、nil 属性に true
が設定されている XML 要素を逆シリアル化できません。XmlSerializer クラスで XML ドキュメントをオブジェクトに逆シリアル化するときに、このような要素が存在した場合には、"入力文字列の形式が正しくありません。" という System.FormatException が出力されます。このような状況は、.NET Framework で NULL 非許容値型にバインドされるスキーマ データ型のインスタンスに対して、nil 属性を使用できる実装の XML スキーマによって、その XML ドキュメントが作成されている場合に発生する可能性があります。
nil 属性とその他の属性
XML スキーマ仕様では、xsi:nil 属性に true
を設定してある要素に対して、他の XML 属性を指定できます。XmlSerializer クラスによって nil 属性に true
が設定されるのは、対応するオブジェクトに null 参照が代入されている場合のみであるため、(System.Xml.Serialization.XmlAttributeAttribute 型の属性を使用することによって) XML 属性を表すオブジェクト フィールドは、この時点ではメモリ内にも存在できません。
このため、XmlSerializer クラスでは、追加の属性が次のように処理されます。
オブジェクトを XML ドキュメントにシリアル化するとき : XmlSerializer クラスの処理対象に、nil 属性を指定する必要のある XML 属性に対応するオブジェクトの null 参照が存在すると、他のすべての属性は省略されます。
XML ドキュメントをオブジェクトに逆シリアル化するとき :
xsi:nil="true"
と指定された XML 要素が存在すると、XmlSerializer クラスでは、対応するオブジェクトに null 参照が代入され、他のすべての属性は無視されます。このような状況は、xsi:nil="true"
属性と一緒に他の属性を指定できる実装の XML スキーマによってその XML ドキュメントが作成されている場合に発生する可能性があります。この XML スキーマでは、値がtrue
の nil は事実上 null オブジェクト参照にバインドされません。
文字列における無効な nil 属性
nillable 属性に既定値として false
が明示的に指定されている、次の <element> 宣言について考察します。
<xsd:element name="key" type="xsd:string" nillable="false" />
この要素は、次のクラス メンバーにバインドされます (IsNullable プロパティには既定値の false
が明示的に指定されています)。
[System.Xml.Serialization.XmlElementAttribute(IsNullable=false)]
public string key;
ある XML ドキュメントの中に、上の <element> 宣言に従うことを前提とした次の要素が含まれているとします。
<key xsi:nil="true"/>
XmlValidatingReader クラスでは、この要素は無効であると認識されます。この要素では、nillable 定義属性の値が false
であるときに、nil インスタンス属性が使用されているためです。ただし、XmlSerializer クラスでこの要素を逆シリアル化するとき、例外はスローされません。その代わり、対応する key
フィールドの値に空の文字列 (""
) が設定されます。
使用可能なコンテナー要素 : 任意のインスタンス要素