Bindungsunterstützung für das default-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 default-Attribut bereit.
Das Tool Xsd.exe setzt ein Standardelement oder einen Standardattributwert mit einem auf ein generiertes Feld angewendeten System.ComponentModel.DefaultValueAttribute gleich. Außerdem wird das Feld statisch auf den Standardwert initialisiert.
Erklärung
Das default-Attribut, das in einer <element>-Deklaration oder einer <attribute>-Deklaration angegeben werden kann, stellt einen Standardwert bereit, der zu verwenden ist, falls das Element leer oder das Attribut nicht vorhanden ist, wenn ein Instanzendokument empfangen wird.
Bei Attributen ist ein Standardwert nur dann von Belang, wenn ein Attribut optional ist (das use-Attribut, das in Bindungsunterstützung für das attribute-Elementbeschrieben wird, hat den Standardwert optional
). Wenn ein Attribut angegeben wird, muss es mit einem Wert angegeben werden.
Bei Elementen wird ein Standardwert nur dann verwendet, falls das Element in einem Instanzendokument ohne jeglichen Inhalt erscheint. Wenn das Element überhaupt nicht erscheint, bleibt es leer.
Beim Generieren von Quellcode aus einem XML-Schemadokument wendet das Tool Xsd.exe auf jedes Feld, das einem Element oder Attribut mit einem Standardwert entspricht, ein System.ComponentModel.DefaultValueAttribute an und übergibt den Standardwert als Argument. Außerdem initialisiert Xsd.exe das Feld statisch auf den Standardwert, wie im folgenden Beispiel dargestellt:
[System.ComponentModel.DefaultValueAttribute(-1)]
public int age = -1;
Das Standardattribut wird in Arrays (Elemente mit maxOccurs größer als 1
) ignoriert.
Bindungsunterstützung nach Datentyp
Laut XML-Schema muss der default-Attributwert ein einfacher Typ sein. Für nahezu alle einfachen Typen behält Xsd.exe beim Durchführen einer Round-Trip-Übersetzung aus einem XML-Schema in Klassen und zurück in ein neues XML-Schemadokument den Standardwert bei.
Eine Ausnahme bilden die Elemente und Attribute des Typs xsd:base64Binary oder xsd:hexBinary. Ein DefaultValue-Attribut wird nicht auf das entsprechende System.Byte-Feld angewendet, das erstellt wird.
Eine weitere Ausnahme bilden die Attribute der Listentypen. Das <list>-Konstrukt wird zum Definieren eines einfachen Typs verwendet, dessen mögliche Werte eine durch Leerzeichen gegliederte Wertefolge von einem anderen einfachen Typ sind. (Xsd.exe generiert keinen Quellcode für Elemente der Listentypen.) Bei Listen erstellt Xsd.exe ein Array des konstituierenden Typs, jedoch konvertiert es den Standardwert in eine Instanz des konstituierenden Typs, nicht in ein Array.
Betrachten Sie die folgende Eingabe-<attribute>-Deklaration:
<xsd:attribute name="siblings" default="unknown">
<xsd:simpleType>
<xsd:list itemType="xsd:string"/>
</xsd:simpleType>
</xsd:attribute>
Für diese Deklaration wird folgender Quellcode generiert:
[System.Xml.Serialization.XmlAttributeAttribute()]
[System.ComponentModel.DefaultValueAttribute("unknown")]
public string[] siblings = "unknown";
Die Kompilierung dieses Quellcodes schlägt fehl, weil ein String-Objekt keine implizite Typumwandlung als ein Array von String-Objekten erlaubt. Der gleiche Fehler tritt bei Listen von beliebigen einfachen Typen auf, einschließlich Enumerationstypen.
Auswirkungen auf das minOccurs-Attribut bei elementbindenden Werttypen
Angenommen ein Klassenmember hat einen .NET Framework-Werttyp und ist einem XML-Element (über das Standard-XmlElementAttribute) zugeordnet. Wenn Xsd.exe beim Generieren eines XSD-Dokuments aus Klassen ein DefaultValue-Attribut findet, das auf einen solchen Member angewendet wird, erzeugt es den Wert 0
für das minOccurs-Attribut des <element>-Elements. Dies gibt an, dass das Element nicht in einem gültigen XML-Instanzendokument aufgeführt werden muss.
Kombination mit use="optional" bei Attributen
Angenommen, eine <attribute>-Deklaration enthält ein use-Attribut mit dem Wert optional
, der dem Standardwert entspricht. Beim Generieren von Quellcode aus einem XSD-Dokument berücksichtigt Xsd.exe bei der Interpretation dieses Werts die Frage, ob das default-Attribut angegeben worden ist. Die folgenden zwei Interpretationen sind möglich:
default angegeben: Xsd.exe generiert ein öffentliches Feld mit einem XmlAttributeAttribute sowie einem DefaultValueAttribute, das den Standardwert angibt.
Kein default-Attribut angegeben: Xsd.exe generiert ein öffentliches Feld mit einem XmlAttributeAttribute. Außerdem wird für Werttypen ein öffentliches Feld vom Typ bool generiert, dessen Name dem Namen des Attributfelds mit dem Suffix
Specified
entspricht. Wenn der Name des Attributfelds z. B.startDate
ist, lautet der Name des bool-FeldsstartDateSpecified
. Beim Serialisieren eines Objekts in XML überprüft die XmlSerializer-Klasse den Wert des bool-Felds, um zu ermitteln, ob das optional-Attribut geschrieben werden soll. Das bool-Feld wird mit einem System.Xml.Serialization.XmlIgnoreAttribute-Objekt angezeigt, um zu verhindern, dass es von XmlSerializer serialisiert wird.
Example
XML-Schema-Eingabedokument:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://example.org/" xmlns="http://example.org/" elementFormDefault="qualified">
<xsd:element name="FamilyDog" type="FamilyDogType"/>
<xsd:complexType name="FamilyDogType">
<xsd:sequence>
<xsd:element name="name" type="xsd:stringo" default="Spot"/>
<xsd:element name="birthdate" type="xsd:date" default="2002-03-04"/>
</xsd:sequence>
<xsd:attribute name="gender" type="GenderType" default="UNKNOWN"/>
<xsd:attribute name="fixed" type="xsd:boolean" default="false"/>
<xsd:attribute name="breed" type="xsd:string" default="Swedish Vallhund"/>
</xsd:complexType>
<xsd:simpleType name="GenderType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="FEMALE" />
<xsd:enumeration value="MALE" />
<xsd:enumeration value="UNKNOWN" />
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
Aus dem vorhergehenden XML-Schemadokument generierte C#-Klassen:
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("FamilyDog", Namespace="http://example.org/", IsNullable=false)]
public class FamilyDogType {
[System.ComponentModel.DefaultValueAttribute("Spot")]
public string name = "Spot";
[System.Xml.Serialization.XmlElementAttribute(DataType="date")]
[System.ComponentModel.DefaultValueAttribute(typeof(System.DateTime), "2002-03-04")]
public System.DateTime birthdate = new System.DateTime(631507968000000000);
[System.Xml.Serialization.XmlAttributeAttribute()]
[System.ComponentModel.DefaultValueAttribute(GenderType.UNKNOWN)]
public GenderType gender = GenderType.UNKNOWN;
[System.Xml.Serialization.XmlAttributeAttribute()]
[System.ComponentModel.DefaultValueAttribute(false)]
public bool @fixed = false;
[System.Xml.Serialization.XmlAttributeAttribute()]
[System.ComponentModel.DefaultValueAttribute("Swedish Vallhund")]
public string breed = "Swedish Vallhund";
}
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
public enum GenderType {
FEMALE,
MALE,
UNKNOWN,
}
Ein XML-Schemadokument, das aus einer Assembly generiert wurde, die ihrerseits aus dem vorhergehenden C#-Quellcode kompiliert wurde, ist identisch mit dem ursprünglichen XML-Schema, aus dem der C#-Quellcode generiert worden war.
Mögliche übergeordnete Elemente: <attribute>, <element>
Siehe auch
Verweis
System.Xml.Schema.XmlSchemaAttribute.DefaultValue
System.Xml.Schema.XmlSchemaElement.DefaultValue