Freigeben über


Bindungsunterstützung für das xsi:nil-Attribut

Dieses Thema bezieht sich auf eine veraltete Technologie. XML-Webdienste und XML-Webdienstclients sollten nun mithilfe der folgenden Technologie erstellt werden: Windows Communication Foundation.

.NET Framework stellt partielle Bindungsunterstützung für das xsi:nil-Attribut bereit.

Die XmlSerializer-Klasse setzt einen xsi:nil="true"-Attributwert mit einem NULL-Verweis gleich, der einem Verweistyp oder einem auf NULL festlegbaren Werttyp zugewiesen wurde. Beim Versuch, eine Instanz eines nicht auf NULL festlegbaren Werttyps zu deserialisieren, löst XmlSerializer eine Ausnahme aus, wenn das nil-Attribut auf true festgelegt ist. (Weitere Informationen über Typen, die auf NULL festgelegt werden können, finden Sie unter Nullable Types (C# Programming Guide).)

Erklärung

Das nil-Attribut ist im XML-Schemainstanz-Namespace definiert, http://www.w3.org/2001/XMLSchema-instance (normalerweise dem Präfix xsi zugeordnet), und gilt nur für XML-Instanzendokumente, nicht XML-Schemadokumente. Der Wert true für das xsi:nil-Attribut in einem XML-Element gibt ausdrücklich an, dass das Element keinen Inhalt hat, d. h. weder untergeordnete Elemente noch Textkörper.

Ein gültiges nil-Attribut kann nur in einem XML-Element erscheinen, dessen XSD-Deklaration ein auf true festgelegtes nillable-Attribut enthält. Informationen darüber, wie .NET Framework ermittelt, ob eine nillable="true"-Einstellung für ein XML-Element gilt, das einem Objekt oder einem Member entspricht, finden Sie unter dem nillable-Attribut.

Die XmlSerializer-Klasse setzt einen true-Wert für das nil-Attribut mit einem Null-Verweis (in Visual Basic: Nothing) gleich, wobei folgende Laufzeitkonvertierungen durchgeführt werden:

  • Beim Deserialisieren eines XML-Dokuments in Objekte: Wenn die XmlSerializer-Klasse ein XML-Element findet, das xsi:nil="true" angibt, weist sie dem entsprechenden Objekt ggf. einen NULL-Verweis zu.

  • Beim Serialisieren von Objekten in ein XML-Dokument: Wenn die XmlSerializer-Klasse einen NULL-Verweis für ein Objekt findet, das einem XML-Element entspricht, generiert sie entweder ein Element, das xsi:nil="true" angibt, oder sie lässt das Element ganz weg, je nachdem, ob eine nillable="true"-Einstellung gilt oder nicht.

Das nil-Attribut und nicht auf NULL festlegbare Werttypen

Da ein nicht auf NULL festlegbarer Werttyp niemals auf einen NULL-Verweis festgelegt werden kann, wenn ein Klassenmember eines solchen Typs einer XML-Elementdeklaration zugeordnet wird, gibt es für die XmlSerializer-Klasse beim Serialisieren keinen Anlass dazu, das xsi:nil-Attribut für ein entsprechendes Instanzelement auszugeben.

Die XmlSerializer-Klasse kann kein XML-Element deserialisieren, dessen Datentyp einem nicht auf NULL festlegbaren Werttyp zugeordnet ist und dessen nil-Attribut auf true festgelegt wurde. Wenn die XmlSerializer-Klasse ein solches Element beim Deserialisieren eines XML-Dokuments in Objekte findet, gibt sie eine System.FormatException aus: "Die Eingabezeichenfolge hat das falsche Format". Dieser Fall kann eintreten, wenn das XML-Dokument mit einer XML-Schemaimplementierung erstellt wurde, die das nil-Attribut in Instanzen von Schemadatentypen zulässt, die .NET Framework an nicht auf Null festlegbare Werttypen bindet.

Das nil-Attribut und andere Attribute

Die XML-Schemaspezifikation erlaubt es anderen XML-Attributen in einem Element zu erscheinen, dessen xsi:nil-Attribut auf true festgelegt wurde. Da die XmlSerializer-Klasse das nil-Attribut nur dann auf true festlegt, wenn dem entsprechenden Objekt ein NULL-Verweis zugewiesen wird, können zu diesem Zeitpunkt keinerlei Objektfelder, die XML-Attribute darstellen (über ein Attribut des Typs System.Xml.Serialization.XmlAttributeAttribute) im Speicher vorhanden sein.

Deshalb behandelt die XmlSerializer-Klasse zusätzliche Attribute wie folgt:

  • Beim Serialisieren von Objekten in ein XML-Dokument: Wenn die XmlSerializer-Klasse einen NULL-Verweis für ein Objekt findet, das einem XML-Element entspricht, für welches das nil-Attribut angegeben werden sollte, übergeht sie alle anderen Attribute.

  • Beim Deserialisieren eines XML-Dokuments in Objekte: Wenn die XmlSerializer-Klasse ein XML-Element findet, das xsi:nil="true" angibt, weist sie dem entsprechenden Objekt einen NULL-Verweis zu und ignoriert alle anderen Attribute. Dieser Fall kann eintreten, wenn das XML-Dokument mit einer XML-Schemaimplementierung erstellt wurde, die es zulässt, dass weitere Attribute zusammen mit xsi:nil="true" erscheinen. Dadurch wird kein nil-Wert von true an einen Null-Objektverweis gebunden.

Ungültiges nil-Attribut für Zeichenfolgentypen

Betrachten Sie folgende <element>-Deklaration mit dem standardmäßigen false-Wert, der ausdrücklich für das nillable-Attribut angegeben wird.

<xsd:element name="key" type="xsd:string" nillable="false" />

Dieses Element würde an den folgenden Klassenmember binden (der standardmäßige false-Wert wird ausdrücklich für die IsNullable-Eigenschaft angegeben):

[System.Xml.Serialization.XmlElementAttribute(IsNullable=false)]
public string key;

Angenommen, ein XML-Instanzendokument enthält das folgende Element, das der vorhergehenden <element>-Deklaration entsprechen soll:

<key xsi:nil="true"/>

Die XmlValidatingReader-Klasse würde dieses Element als ungültig erkennen, da es ein nil-Instanzattribut verwendet, wenn der Wert des nillable-Definitionsattributs false ist. Die XmlSerializer-Klasse würde jedoch keine Ausnahme beim Serialisieren dieses Elements auslösen; stattdessen würde sie den Wert des entsprechenden key-Felds auf eine leere Zeichenfolge festlegen, dargestellt als "".

Mögliche Containerelemente: jedes Instanzelement

Siehe auch

Verweis

Bindungsunterstützung für das nillable-Attribut