Bindungsunterstützung für das any-Element
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 bietet partielle Bindungsunterstützung für das <any>-Element.
Beim Generieren von Quellcode aus einem XML-Schemadokument wandelt Xsd.exe das <any>-Element in ein Feld des Typs XmlElement mit einem XmlAnyElementAttribute-Attribut um.
Erklärung
Der <any>-Platzhalter ermöglicht, dass an der angegebenen Stelle in einem XML-Instanzendokument ein beliebiges Element (ein Element mit beliebigem Namen oder Typ) mit ein paar Einschränkungen auftreten kann.
Beim Generieren von Quellcode aus einem XML-Schemadokument wandelt Xsd.exe das <any>-Element in ein Feld des Typs XmlElement mit einem XmlAnyElementAttribute-Attribut um. Dieses Attribut ermöglicht einer Klasse, beliebige XML-Elemente darzustellen, ohne diese an Nicht-XML-Typen zu binden, die in anderen möglichen Feldern oder Eigenschaften der Klasse angegeben sind.
Wenn das <any>-Element mit einem maxOccurs-Attribut auftritt, das einen Wert größer als 1 oder unbounded
aufweist, erzeugt Xsd.exe ein XmlElement-Array mit einem XmlAnyElement-Attribut. Ein einziges XmlElement wird erzeugt, wenn der Wert des maxOccurs-Attributs 1
(Standard) oder 0
ist. Eine Erläuterung dieses Verhaltens finden Sie unter den Ausführungen zum maxOccurs-Attribut.
Beim Generieren eines XML-Schemadokuments aus einer Reihe von Klassen in einer Assembly führt Xsd.exe die umgekehrte Übersetzung durch: Felder oder Eigenschaften des Typs System.Xml.XmlElement mit dem XmlAnyElementAttribute-Attribut werden in <any>-Elemente übersetzt.
namespace-Attribut und processContents-Attribut
Beim Generieren von XML-Schemadefinitionen oder Klassen werden das namespace-Attribut und das processContents-Attribut ignoriert. Dies bedeutet, dass unabhängig von den Attributwerten in einer ursprünglichen XML-Schemadefinition beim Generieren von Klassen aus dieser Definition und dem anschließenden Generieren eines XML-Schemas aus diesen Klassen durch Xsd.exe das <any>-Element des generierten XML-Schemas diese Attribute nicht mehr aufweist. Daher werden im letzteren Schema die folgenden Standardwerte übernommen:
namespace="##any"
: Das namespace-Attribut gibt die Namespaces an, in denen das Element definiert werden muss. Ein Wert von##any
lässt jeden Namespace zu.processContents="strict"
: Stellt beim Überprüfen eines XML-Instanzendokuments auf Übereinstimmung mit dem angegebenen XML-Schema sicher, dass alle Elementtypen entsprechend den angegebenen Namespaces überprüft werden. Wenn ein Elementtyp nicht erkannt wird, schlägt die Validierung fehl.
Ebenso werden das namespace-Attribut und das processContents-Attribut bei der Deserialisierung von XML-Dokumenten in Objekte ignoriert. Stattdessen verhält sich die XmlSerializer-Klasse so, als ob die beiden Attribute auf die folgenden Werte festgelegt wurden:
namespace="##any"
: Dies ist der Standardwert.processContents="lax"
: Überprüft beim Überprüfen eines XML-Instanzendokuments auf Übereinstimmung mit dem angegebenen XML-Schema das Element nur, wenn sein Namespace abgerufen werden kann. Andernfalls wird sichergestellt, dass nicht erkannte Elemente aus wohlgeformtem XML-Code bestehen.
Hinweis: |
---|
Obwohl .NET Framework zur Laufzeit von processContents="lax" ausgeht, generiert .NET Framework zur Bereitstellungszeit XML-Schemadefinitionen, wenn der Standardwert processContents="strict" implizit angegeben ist.
|
Xsd.exe und die XmlSerializer-Klasse stellen die gleichen Bindungen für das namespace-Attribut und das processContents-Attribut bereit, wenn sie im <anyAttribute>-Element dargestellt werden.
Beispiel
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="complexInstance" type="MyComplexType"/>
<xsd:complexType name="MyComplexType">
<xsd:sequence>
<xsd:element name="field1" type="xsd:string"/>
<xsd:any namespace="##local" processContents="strict"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
Aus dem vorherigen XML-Schemadokument generierte C#-Klasse:
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("complexInstance", Namespace="http://example.org/", IsNullable=false)]
public class MyComplexType {
public string field1;
[System.Xml.Serialization.XmlAnyElementAttribute()]
public System.Xml.XmlElement Any;
}
Aus einer Assembly, die aus der vorherigen C#-Quelle kompiliert wurde, generierter komplexer XML-Schematyp:
<xs:schema xmlns:tns="http://example.org/" elementFormDefault="qualified" targetNamespace="http://example.org/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="complexInstance" type="tns:MyComplexType" />
<xs:complexType name="MyComplexType">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" name="field1" type="xs:string" />
<xs:any minOccurs="0" maxOccurs="1" />
</xs:sequence>
</xs:complexType>
</xs:schema>
Mögliche Attribute | Bindungsunterstützung |
---|---|
id |
Das Hilfsprogramm Xsd.exe ignoriert das id-Attribut, mit dem ein eindeutiger Bezeichner bereitgestellt werden soll. |
maxOccurs |
Siehe den Abschnitt Erklärung in diesem Thema. Siehe auch die Ausführungen zum Bindungsunterstützung für das maxOccurs-Attribut-Attribut. |
minOccurs |
Beim Generieren von Quellcode aus einem XML-Schemadokument ignoriert das Tool Xsd.exe das minOccurs-Attribut, wenn dieses auf das <any>-Element angewendet wird. Beim Generieren eines XSD-Dokuments aus Klassen erzeugt das Tool Xsd.exe für das minOccurs-Attribut im <any>-Element den Wert Weitere Informationen finden Sie in den Ausführungen zum Bindungsunterstützung für das minOccurs-Attribut-Attribut. |
namespace |
Siehe den Abschnitt über das namespace-Attribut und das processContents-Attribut in diesem Thema. |
processContents |
Siehe den Abschnitt über das namespace-Attribut und das processContents-Attribut in diesem Thema. |
Mögliche übergeordnete Elemente: <choice>, <sequence>
Mögliche untergeordnete Elemente: <annotation>