Freigeben über


Bindungsunterstützung für das element-Element

.NET Framework stellt Bindungsunterstützung für das <element>-Element bereit.

Erklärung

Die XML-Schemaspezifikation gibt an, dass ein Element lokal in einer komplexen Typdefinition oder global als untergeordnetes Element des <schema>-Stammelements deklariert werden kann. Wenn das Element global deklariert wird, kann in komplexen Typdefinitionen über das ref-Attribut darauf verwiesen werden.

Das folgende Codebeispiel zeigt ein lokal deklariertes Element:

<xsd:complexType name="UnitType">
  <xsd:sequence>
   <xsd:element name="name" type="xsd:string"/>
  </xsd:sequence>
</xsd:complexType>

Das folgende Codebeispiel zeigt dasselbe Element als global deklariert und dann verwiesen:

<xsd:element name="name" type="xsd:string"/>
<xsd:complexType name="UnitType">
  <xsd:sequence>
    <xsd:element ref="name"/>
  </xsd:sequence>
</xsd:complexType>

Beim Generieren eines .NET Framework-Typs aus einem komplexen XML-Schematyp unterscheidet Xsd.exe nicht zwischen einem lokal deklarierten Element und einem Verweis auf ein global deklariertes Element, sofern das global deklarierte Element nicht in einem anderen Namespace als dem Zielnamespace des Schemas deklariert wird.

Verweis innerhalb desselben Namespaces

Da Xsd.exe innerhalb eines Namespaces nicht unterscheidet, werden bei einer Round-Trip-Übersetzung aus einem XML-Schema in Klassen und wieder zurück lokale Elemente erstellt, die alle Verweise auf globale Elemente ersetzen.

Wenn der Datentyp des globalen Elements, auf das verwiesen wird, bereits eine automatische Bindung zu einem .NET Framework-Typ aufweist, generiert Xsd.exe keinen neuen Typ für den Datentyp. Daher besteht in dem XML-Schema, das in der Schleife generiert wurde, kein Verweis mehr auf das globale Element, und es ist in diesem auch nicht mehr vorhanden.

NoteHinweis:

Alle integrierten XML-Schemadatentypen haben automatische Bindungen zu .NET Framework-Typen. Außerdem werden in Schemas definierte einfache Typen normalerweise an .NET Framework-Typen und nicht an benutzerdefinierte Typen gebunden. Die einzige Ausnahme bildet die Enumeration von Zeichenfolgenbindungs-Typen. Diese Ausnahme wird in der Dokumentation des <enumeration>-Elements ausführlich erläutert.

NoteHinweis:

Weitere Informationen zur Unterstützung schemadefinierter einfacher Typen finden Sie in den Ausführungen zum <restriction>-Element sowie zu allen Elementen, die Beschränkungsfacets darstellen.

Verweis auf einen anderen Namespace

Wenn eine globale Deklaration, auf die verwiesen wird, einem anderen Namespace angehört, gibt Xsd.exe den Namespace über die Namespace-Eigenschaft eines XmlElementAttribute-Attributs an, das auf das generierte Feld angewendet wird. Für dieses Element überschreibt der über die Namespace-Eigenschaft angegebene Namespace den auf Klassenebene über das XmlTypeAttribute-Attribut sowie optional das XmlRootAttribute angegebenen Namespace. Beispiel:

[System.Xml.Serialization.XmlElementAttribute(Namespace="http://example.org/elem")]
public string Text;

Zusätzliche Namespaces werden mit dem <import>-Element in eine XML-Schemadefinition importiert.

Erstellen globaler Elementdeklarationen

Beim Generieren eines XML-Schemadokuments aus einer Reihe von Klassen in einer Assembly erstellt Xsd.exe eine globale <element>-Deklaration für jede <complexType>-Definition oder <simpleType>-Definition, die aus einem in der Assembly definierten Typ erstellt wird.

Dieses erste Beispiel zeigt, wie Xsd.exe ein globales Element verarbeitet, wenn dieses Element im selben Zielnamespace definiert ist, der einen Verweis darauf enthält.

XML-Schema-Eingabedokument:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      xmlns="http://example.org/" targetNamespace="http://example.org/" elementFormDefault="qualified">
  <xsd:element name="Text" type="xsd:normalizedString"/>
  <xsd:complexType name="Branch">
    <xsd:sequence>
      <xsd:element name="children" type="xsd:token" minOccurs="0" maxOccurs="unbounded" />
      <xsd:element ref="Text" />
    </xsd:sequence>
    <xsd:attribute name="key" type="xsd:token"/>
  </xsd:complexType>
  <xsd:element name="branch" type="Branch"/>
</xsd:schema>

Aus dem vorherigen XML-Schemadokument generierte C#-Klasse:

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("branch", Namespace="http://example.org/", IsNullable=false)]
public class Branch {
        
    [System.Xml.Serialization.XmlElementAttribute("children", DataType="token")]
    public string[] children;
        
    [System.Xml.Serialization.XmlElementAttribute(DataType="normalizedString")]
    public string Text;
        
    [System.Xml.Serialization.XmlAttributeAttribute(DataType="token")]
    public string key;
}

Von einer Assembly, die aus der vorherigen C#-Quelle kompiliert wurde, generiertes XML-Schemadokument:

<xs:schema xmlns:tns="http://example.org/" elementFormDefault="qualified" targetNamespace="http://example.org/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="branch" type="tns:Branch" />
  <xs:complexType name="Branch">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="unbounded" name="children" type="xs:token" />
      <xs:element minOccurs="0" maxOccurs="1" name="Text" type="xs:normalizedString" />
    </xs:sequence>
    <xs:attribute name="key" type="xs:token" />
  </xs:complexType>
</xs:schema>

Im vorherigen generierten XML-Schema ist aus dem Text-Element, das ursprünglich global deklariert wurde, ein lokales Element geworden.

Dieses zweite Beispiel zeigt, wie Xsd.exe einen Verweis auf ein globales Element verarbeitet, wenn dieses Element in einem separaten Namespace definiert ist. In diesem Beispiel wird das <import>-Element verwendet, um einen zweiten Namespace zu importieren, der sich in einer separaten XSD-Datei befindet. (Der Speicherorts der importierten XSD-Datei wird nicht im schemaLocation-Attribut des <import>-Elements definiert. Stattdessen wird die Datei als zusätzliches Befehlszeilenargument für Xsd.exe angegeben.)

Das als Eingabe verwendete XML-Schemadokument der obersten Ebene:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
      xmlns="http://example.org/" targetNamespace="http://example.org/" xmlns:elem="http://example.org/elem">
  <xsd:import  namespace="http://example.org/elem" />
  <xsd:complexType name="Branch">
    <xsd:sequence>
      <xsd:element name="children" type="xsd:token" minOccurs="0" maxOccurs="unbounded" />
      <xsd:element ref="elem:Text" />
    </xsd:sequence>
    <xsd:attribute name="key" type="xsd:token"/>
  </xsd:complexType>
  <xsd:element name="branch" type="Branch"/>
</xsd:schema>

Das als Eingabe verwendete importierte XML-Schemadokument:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" 
      xmlns="http://example.org/elem" targetNamespace="http://example.org/elem">
  <xsd:element name="Text" type="xsd:normalizedString"/>
</xsd:schema>

Aus den vorherigen beiden XML-Schemadokumenten generierte C#-Klasse:

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("branch", Namespace="http://example.org/", IsNullable=false)]
public class Branch {
        
    [System.Xml.Serialization.XmlElementAttribute("children", DataType="token")]
    public string[] children;
        
    [System.Xml.Serialization.XmlElementAttribute(Namespace="http://example.org/elem", DataType="normalizedString")]
    public string Text;
        
    [System.Xml.Serialization.XmlAttributeAttribute(DataType="token")]
    public string key;
}

Von einer Assembly, die aus der vorherigen C#-Quelle kompiliert wurde, generiertes XML-Schemadokument der obersten Ebene:

<xs:schema xmlns:tns="http://example.org/" elementFormDefault="qualified" targetNamespace="http://example.org/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:import namespace="http://example.org/elem" />
  <xs:element name="branch" type="tns:Branch" />
  <xs:complexType name="Branch">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="unbounded" name="children" type="xs:token" />
      <xs:element minOccurs="0" maxOccurs="1" xmlns:q1="http://example.org/elem" ref="q1:Text" />
    </xs:sequence>
    <xs:attribute name="key" type="xs:token" />
  </xs:complexType>
</xs:schema>

Importiertes, von einer Assembly, die aus der vorherigen C#-Quelle kompiliert wurde, generiertes XML-Schemadokument:

<xs:schema xmlns:tns="http://example.org/elem" elementFormDefault="qualified" targetNamespace="http://example.org/elem" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Text" type="xs:normalizedString" />
</xs:schema>

Abstract-Attribut

Eine globale Elementdeklaration kann über ein abstract-Attribut verfügen, ein lokales Element nicht.

Deklarieren Sie ein Element als abstrakt (abstract="true"), um dessen Ersetzung über eine Ersatzgruppe zu erzwingen. Bei nicht abstrakten Elementen ist die Ersetzung optional.

Das ersetzte globale Element wird als Anfangselement bezeichnet. Wenn eine lokale Elementdeklaration über das ref-Attribut auf das Anfangselement verweist, können Sie stattdessen globale Ersatzelemente verwenden. Weitere Informationen finden Sie in den Ausführungen zum substitutionGroup-Attribut.

Wenn die Ersatzelemente abgeleiteten Datentypen angehören und das Anfangselement selbst als abstrakt deklariert ist (anstatt eine <complexType>-Definition für den Typ aufzuweisen, die als abstrakt deklariert ist), können Sie den Basistyp an anderer Stelle in einem XML-Instanzendokument verwenden, obwohl dies nicht an der Position möglich ist, an der die Ersetzung stattfindet.

Beim Generieren von Quellcode aus einem XML-Schemadokument erstellt Xsd.exe einen Typ, der dem Datentyp des Anfangselements entspricht. Der Typ schließt ein Feld mit dem Namen Item ein. Xsd.exe wendet auf dieses Feld für jede Ersetzung ein XmlElementAttribute an. Jedes Attribut identifiziert den Namen und, sofern das Ersatzelement über einen abgeleiteten Datentyp verfügt, den Typ. Wenn die Ersatzelemente denselben Datentyp wie das Anfangselement verwenden, muss außerdem ein XmlChoiceIdentifierAttribute angewendet werden. Weitere Informationen finden Sie in den Ausführungen zum <choice>-Element.

Das folgende Codebeispiel zeigt ein Beispielfeld, Item, das aus einem Verweis auf ein abstraktes Anfangselement generiert wurde:

[System.Xml.Serialization.XmlElementAttribute("derivedAInstance", typeof(DerivedTypeA))]
[System.Xml.Serialization.XmlElementAttribute("derivedBInstance", typeof(DerivedTypeB))]
public MyBaseType Item;

Wenn Sie Ersatzelemente verwenden, die abgeleiteten Datentypen angehören, ist XML-Serialisierung nur möglich, sofern eine Instanz eines der abgeleiteten Typen dem Feld zugewiesen wurde. Die XmlSerializer-Klasse schlägt fehl, wenn eine Instanz des Basistyps zugewiesen wurde, die dem Anfangselement entspricht.

Bei einer umgekehrten Übersetzung erstellt Xsd.exe ein <choice>-Element, das für jedes Ersatzelement ein <element>-Element enthält, und kein <element> für das Anfangselement. Die Elemente werden unabhängig innerhalb der komplexen Typdefinition definiert. Es werden keine ref-Verweise eingesetzt.

NoteHinweis:

In einer lokalen <element>-Deklaration mit einem ref-Attribut, in dem ein abstraktes Anfangselement angegeben ist, ignoriert Xsd.exe das maxOccurs-Attribut.

NoteHinweis:

Betrachten Sie die folgende Deklaration zu einem Anfangselement des Typs MyBaseType:

<xsd:element ref="baseInstance" minOccurs="0" maxOccurs="unbounded" />
NoteHinweis:

Für die vorangehende Deklaration erzeugt Xsd.exe immer noch das folgende Feld (Attribute ausgelassen):

public MyBaseType Item;
NoteHinweis:

Xsd.exe generiert keine Klassen, wenn alle global deklarierten Elemente im Eingabe-XML-Schema abstrakt sind.

Beispiel: Abstract-Attribut

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="baseInstance" type="MyBaseType" abstract="true"/>

  <xsd:complexType name="MyBaseType">
    <xsd:sequence>
      <xsd:element name="Field1" type="xsd:string"/>
      <xsd:element name="Field2" type="xsd:string"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:element name="derivedAInstance" type="DerivedTypeA" substitutionGroup="baseInstance" />
  <xsd:complexType name="DerivedTypeA">
    <xsd:complexContent>
      <xsd:extension base="MyBaseType">
         <xsd:attribute name="ExtraInfoForA" type="xsd:string"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:element name="derivedBInstance" type="DerivedTypeB" substitutionGroup="baseInstance" />
  <xsd:complexType name="DerivedTypeB">
    <xsd:complexContent>
      <xsd:extension base="MyBaseType">
         <xsd:attribute name="ExtraInfoForB" type="xsd:string"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:element name="myThings" type="MyThingsType" />
  <xsd:complexType name="MyThingsType">
    <xsd:sequence>
      <xsd:element ref="baseInstance" />
    </xsd:sequence>
  </xsd:complexType>
</xsd:schema>

Aus dem vorhergehenden XML-Schemadokument generierte C#-Klassen:

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("derivedAInstance", Namespace="http://example.org/", IsNullable=false)]
public class DerivedTypeA : MyBaseType {
        
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string ExtraInfoForA;
}
    
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(DerivedTypeA))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(DerivedTypeB))]
public class MyBaseType {
    public string Field1;
        
    public string Field2;
}
    
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("derivedBInstance", Namespace="http://example.org/", IsNullable=false)]
public class DerivedTypeB : MyBaseType {
        
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string ExtraInfoForB;
}
    
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("myThings", Namespace="http://example.org/", IsNullable=false)]
public class MyThingsType {       
    [System.Xml.Serialization.XmlElementAttribute("derivedAInstance", typeof(DerivedTypeA))]
    [System.Xml.Serialization.XmlElementAttribute("derivedBInstance", typeof(DerivedTypeB))]
    public MyBaseType Item;
}

Von einer Assembly, die aus der vorherigen C#-Quelle kompiliert wurde, generiertes XML-Schemadokument:

<xs:schema xmlns:tns="http://example.org/" elementFormDefault="qualified" targetNamespace="http://example.org/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:complexType name="MyBaseType">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="1" name="Field1" type="xs:string" />
      <xs:element minOccurs="0" maxOccurs="1" name="Field2" type="xs:string" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="DerivedTypeA">
    <xs:complexContent mixed="false">
      <xs:extension base="tns:MyBaseType">
        <xs:attribute name="ExtraInfoForA" type="xs:string" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="DerivedTypeB">
    <xs:complexContent mixed="false">
      <xs:extension base="tns:MyBaseType">
        <xs:attribute name="ExtraInfoForB" type="xs:string" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:element name="derivedAInstance" type="tns:DerivedTypeA" />
  <xs:element name="derivedBInstance" type="tns:DerivedTypeB" />
  <xs:element name="myThings" type="tns:MyThingsType" />
  <xs:complexType name="MyThingsType">
    <xs:sequence>
      <xs:choice minOccurs="1" maxOccurs="1">
        <xs:element minOccurs="0" maxOccurs="1" name="derivedAInstance" type="tns:DerivedTypeA" />
        <xs:element minOccurs="0" maxOccurs="1" name="derivedBInstance" type="tns:DerivedTypeB" />
      </xs:choice>
    </xs:sequence>
  </xs:complexType>
</xs:schema> 

SubstitutionGroup-Attribut

Das Tool Xsd.exe erkennt Ersatzgruppen nur dann, wenn das ersetzte Element abstrakt deklariert ist. (Siehe den vorangehenden Abschnitt Abstract Attribute.) Bei einer umgekehrten Übersetzung erstellt Xsd.exe dann ein <choice>-Element, das für jede Ersetzung ein <element>-Element enthält.

SubstitutionGroup-Attribut: Hintergrund

Das substitutionGroup-Attribut kann von einem global deklarierten Element begleitet sein, damit es die Möglichkeit erhält, in einem XML-Instanzendokument anstelle eines anderen global deklarierten Elements aufzutreten. Der Attributwert ist der Name des Elements, das ersetzt wird. Dies wird als Kopfteil bezeichnet. Die eigentliche Ersetzung kann in einem <element>-Element innerhalb einer komplexen Typdefinition stattfinden, in dem über das ref-Attribut auf das Anfangselement verwiesen wird. Mit dem substitutionGroup-Attribut deklarierte Elemente müssen demselben Datentyp wie das Anfangselement oder einem abgeleiteten Datentyp angehören.

Ersatzgruppen werden verwendet, damit Elemente mit verschiedenen Namen und optional verschiedenen Typen desselben Basistyps in einem Instanzendokument an einer angegebenen Position aufgeführt werden können.

Geschachtelte Ersetzungsgruppen werden nicht unterstützt. Das heißt, wenn ein Element als Anfangselement in einer Ersetzungsgruppe fungiert, kann es nicht das ersetzte Element in einer anderen Ersetzungsgruppe sein. Beispiele:

<xs:element name="Animal" abstract="true"/>
<xs:element name="Mammal" abstract="true" 
    substitutionGroup="tns:Animal"/>
<xs:element name="Dog" type="xs:string" 
    substitutionGroup="tns:Mammal"/>

Dies wird nicht unterstützt, denn Mammal fungiert sowohl als Anfangselement (für Dog) als auch als ersetztes Element (für Animal). Wird ein solches Schema vorgefunden, generiert Xsd.exe kein XmlElementAttribute für Mammal, und Dog ist nicht dort, wo das Animal-Element erwartet wird. Aber Sie können es manuell hinzufügen, damit dieser Fall funktioniert, wie im folgenden Beispiel gezeigt:

public class PetShop 
{
    private object Animal;
    
    // Apply the XmlElementAttribute to the generated property.
    [System.Xml.Serialization.XmlElementAttribute("Mammal"), 
     System.Xml.Serialization.XmlElementAttribute("Dog")]
    public object Animal {
        get {
            return this.Animal;
        }
        set {
            this.Animal = value;
        }
    }
}

SubstitutionGroup-Attribut: konkretes Anfangselement

Wenn das Anfangselement nicht abstrakt ist, erstellt Xsd.exe mithilfe jedes ref-Verweises auf das Anfangselement ein Feld, dessen Typ dem XML-Datentyp des Anfangselements entspricht. (Das Feld kann auch ein Array dieses Typs aufweisen. Dies hängt vom Wert des maxOccurs-Attributs des verweisenden Elements ab.) Jeder Verweis auf die Ersatzgruppe geht verloren.

Obwohl ein Objekt eines abgeleiteten Typs diesem Feld zugewiesen werden kann und die XmlSerializer-Klasse dieses Objekt dann serialisiert, findet dieses Verhalten außerhalb der Ersetzung mit abgeleiteten Typen statt. Es wird kein Ersatzelementname verwendet.

SubstitutionGroup-Attribut: abstraktes Anfangselement

Wenn das Anfangselement abstrakt ist, erzeugt Xsd.exe ein Feld, dessen Typ dem Datentyp des Anfangselements entspricht. Das Feld erhält den Namen Item. Xsd.exe wendet auf dieses Feld für jede Ersetzung ein XmlElementAttribute an. Jedes Attribut identifiziert den Namen und, sofern das Ersatzelement über einen abgeleiteten Datentyp verfügt, den Typ. Wenn die Ersatzelemente denselben Datentyp wie das Anfangselement verwenden, muss außerdem ein XmlChoiceIdentifierAttribute angewendet werden. Weitere Informationen finden Sie in den Ausführungen zum <choice>-Element.

Es folgt ein Beispielfeld, das aus einem Verweis auf ein abstraktes Anfangselement generiert wurde:

[System.Xml.Serialization.XmlElementAttribute("derivedAInstance", typeof(DerivedTypeA))]
[System.Xml.Serialization.XmlElementAttribute("derivedBInstance", typeof(DerivedTypeB))]
public MyBaseType Item;

Wenn abgeleitete Typen verwendet werden, ist XML-Serialisierung nur möglich, sofern eine Instanz eines der abgeleiteten Typen dem Feld zugewiesen wurde. XmlSerializer scheitert, wenn eine Instanz des Basistyps zugewiesen wurde, die dem Anfangselement entspricht.

Bei einer umgekehrten Übersetzung erstellt Xsd.exe aus diesem Konstrukt ein <choice>-Element, das für jedes Ersatzelement ein <element>-Element enthält, jedoch nicht für das Anfangselement. Die Elemente werden unabhängig innerhalb der komplexen Typdefinition definiert. Es werden keine ref-Verweise eingesetzt.

maxOccurs-Attribut. In einer lokalen <element>-Deklaration mit einem ref-Attribut, in dem ein abstraktes Anfangselement angegeben ist, ignoriert Xsd.exe das maxOccurs-Attribut.

Betrachten Sie die folgende Deklaration, die sich auf ein Anfangselement des Typs MyBaseType bezieht:

<xsd:element ref="baseInstance" minOccurs="0" maxOccurs="unbounded" />

Für die vorangehende Deklaration erzeugt Xsd.exe immer noch das folgende Feld (Attribute ausgelassen):

public MyBaseType Item;

Beispiel: SubstitutionGroup-Attribut

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="baseInstance" type="MyBaseType" abstract="true"/>

  <xsd:complexType name="MyBaseType">
    <xsd:sequence>
      <xsd:element name="Field1" type="xsd:string"/>
      <xsd:element name="Field2" type="xsd:string"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:element name="derivedAInstance" type="DerivedTypeA" substitutionGroup="baseInstance" />
  <xsd:complexType name="DerivedTypeA">
    <xsd:complexContent>
      <xsd:extension base="MyBaseType">
         <xsd:attribute name="ExtraInfoForA" type="xsd:string"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:element name="derivedBInstance" type="DerivedTypeB" substitutionGroup="baseInstance" />
  <xsd:complexType name="DerivedTypeB">
    <xsd:complexContent>
      <xsd:extension base="MyBaseType">
         <xsd:attribute name="ExtraInfoForB" type="xsd:string"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:element name="myThings" type="MyThingsType" />
  <xsd:complexType name="MyThingsType">
    <xsd:sequence>
      <xsd:element ref="baseInstance" />
    </xsd:sequence>
  </xsd:complexType>
</xsd:schema>

Aus dem vorhergehenden XML-Schemadokument generierte C#-Klassen:

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("derivedAInstance", Namespace="http://example.org/", IsNullable=false)]
public class DerivedTypeA : MyBaseType {
        
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string ExtraInfoForA;
}
    
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(DerivedTypeA))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(DerivedTypeB))]
public class MyBaseType {
    public string Field1;
        
    public string Field2;
}
    
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("derivedBInstance", Namespace="http://example.org/", IsNullable=false)]
public class DerivedTypeB : MyBaseType {
        
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string ExtraInfoForB;
}
    
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("myThings", Namespace="http://example.org/", IsNullable=false)]
public class MyThingsType {       
    [System.Xml.Serialization.XmlElementAttribute("derivedAInstance", typeof(DerivedTypeA))]
    [System.Xml.Serialization.XmlElementAttribute("derivedBInstance", typeof(DerivedTypeB))]
    public MyBaseType Item;
}

Von einer Assembly, die aus der vorherigen C#-Quelle kompiliert wurde, generiertes XML-Schemadokument:

<xs:schema xmlns:tns="http://example.org/" elementFormDefault="qualified" targetNamespace="http://example.org/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:complexType name="MyBaseType">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="1" name="Field1" type="xs:string" />
      <xs:element minOccurs="0" maxOccurs="1" name="Field2" type="xs:string" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="DerivedTypeA">
    <xs:complexContent mixed="false">
      <xs:extension base="tns:MyBaseType">
        <xs:attribute name="ExtraInfoForA" type="xs:string" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="DerivedTypeB">
    <xs:complexContent mixed="false">
      <xs:extension base="tns:MyBaseType">
        <xs:attribute name="ExtraInfoForB" type="xs:string" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:element name="derivedAInstance" type="tns:DerivedTypeA" />
  <xs:element name="derivedBInstance" type="tns:DerivedTypeB" />
  <xs:element name="myThings" type="tns:MyThingsType" />
  <xs:complexType name="MyThingsType">
    <xs:sequence>
      <xs:choice minOccurs="1" maxOccurs="1">
        <xs:element minOccurs="0" maxOccurs="1" name="derivedAInstance" type="tns:DerivedTypeA" />
        <xs:element minOccurs="0" maxOccurs="1" name="derivedBInstance" type="tns:DerivedTypeB" />
      </xs:choice>
    </xs:sequence>
  </xs:complexType>
</xs:schema>
Mögliche Attribute Bindungsunterstützung

abstract

Das Dienstprogramm Xsd.exe bindet Ersatzgruppen mithilfe abstrakter <element>-Deklarationen, erzeugt bei einer umgekehrten Übersetzung jedoch <choice>-Elemente.

Weitere Informationen finden Sie im vorhergehenden Abschnitt Abstract-Attribut.

block

Mit dem block-Attribut kann verhindert werden, dass Elementdeklarationen als Ersatzgruppen-Kopfteile (die Elemente, die durch Mitglieder der Gruppe ersetzt werden) verwendet werden.

Das Tool Xsd.exe ignoriert das block-Attribut sowie das blockDefault-Attribut des Bindungsunterstützung für das schema-Element-Elements.

default

Das default-Attribut stellt einen Standardwert dar, der verwendet wird, wenn das Element in einem Instanzendokument leer ist. Wenn das Element überhaupt nicht enthalten ist, wird es nicht ausgefüllt.

Beim Generieren von Quellcode aus einem XML-Schemadokument wendet das Tool Xsd.exe für jedes Feld, das einem Element 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;

Beim Generieren eines <element>-Elements aus einem Klassenmitglied mit .NET Framework-Werttyp verwendet Xsd.exe das DefaultValue-Attribut als Eingabe beim Festlegen des minOccurs-Attributs. Wenn Xsd.exe ein DefaultValue-Attribut findet, das auf ein derartiges Mitglied angewendet wird, erzeugt es für das minOccurs-Attribut des Elements den Wert 0. Dies gibt an, dass das Element nicht in einem gültigen XML-Instanzendokument aufgeführt werden muss.

Das Standardattribut wird in Arrays (Elemente mit maxOccurs größer als 1) ignoriert.

Weitere Informationen finden Sie unter dem Bindungsunterstützung für das default-Attribut-Attribut.

final

Mit dem final-Attribut kann verhindert werden, dass Elementdeklarationen als Ersatzgruppen-Kopfteile (die Elemente, die durch Mitglieder der Gruppe ersetzt werden) verwendet werden.

Xsd.exe ignoriert das final-Attribut sowie das finalDefault-Attribut des <schema>-Elements.

fixed

Das fixed-Attribut stellt einen festen Wert für das Element in einem Instanzendokument bereit. Beim Generieren von Quellcode aus einem XML-Schemadokument übernimmt Xsd.exe jedes Feld, das einem Element mit Standardwert oder Attribut mit Standardwert entspricht, und generiert eine statische Initialisierung für das Feld, wie im folgenden Beispiel gezeigt:

public int age = -1;

Das fixed-Attribut wird in Arrays (Elemente mit maxOccurs größer als 1) ignoriert.

form

Das Tool Xsd.exe setzt das form-XML-Attribut des <element>-Elements mit der Form-Eigenschaft des XmlElementAttribute gleich. Die XML-Serialisierungsinfrastruktur von .NET Framework erkennt einen anderen Standardwert, qualified.

Wenn eine <element>-Deklaration in einem XML-Schema als form="unqualified" angegeben ist, generiert Xsd.exe für das entsprechende Feld ein XmlElement-Attribut und übergibt dem Attribut einen Parameter, Form=XmlSchemaForm.Unqualified.

Weitere Informationen finden Sie unter form-Attribut.

id

Das Dienstprogramm Xsd.exe ignoriert das id-Attribut, mit dem ein eindeutiger Bezeichner bereitgestellt werden soll. Stattdessen erkennt Xsd.exe das name-Attribut.

maxOccurs

Beim Generieren von Klassen aus einem XSD-Dokument interpretiert Xsd.exe das maxOccurs-Attribut im <element>-Element entsprechend den folgenden möglichen Werten:

  • 1: Xsd.exe erzeugt ein Feld, dessen Typ dem Datentyp des Elements entspricht.

  • 0: Xsd.exe verarbeitet den Wert 0 nicht und behandelt stattdessen den Wert als Standardwert 1.

  • unbounded: Xsd.exe erzeugt ein Feld, das ein Array des Typs entsprechend dem Datentyp des Elements ist.

  • Jede ganze Zahl über 1: Wie beim Wert unbounded erzeugt Xsd.exe ein Feld, das ein Array des Typs entsprechend dem Datentyp des Elements ist. Sie können einen Wert über 1 erzwingen, indem Sie ein XML-Dokument mit der XmlValidatingReader-Klasse über ein XML-Schemadokument überprüfen, das durch das SOM dargestellt wird.

Beim Generieren eines XML-Schemadokuments aus einer Reihe von Klassen in einer Assembly kehrt Xsd.exe die vorangehenden Konvertierungen um und erzeugt den maxOccurs-Wert 1 aus einer einzigen Instanz bzw. den maxOccurs-Wert unbounded aus einem Array.

Während Xsd.exe den maxOccurs-Wert unbounded an ein Array bindet, wird der maxOccurs-Wert 1 an das vorgesehene übergeordnete Element gebunden, sofern vorhanden. In den Ausführungen zum Bindungsunterstützung für das maxOccurs-Attribut-Attribut finden Sie weitere Informationen zur Behandlung des maxOccurs-Elements für Arraybindungen, einschließlich der Verwendung eines zusätzlichen übergeordneten Elements.

minOccurs

Beim <element>-Element überprüft Xsd.exe den Wert des minOccurs-Attributs nur, wenn der Wert des Bindungsunterstützung für das maxOccurs-Attribut-Attributs kein Arrayfeld vorgibt. Der Wert wird anschließend nach verschiedenen Faktoren interpretiert (oder erstellt), je nachdem, ob das entsprechende Feld einen Verweis- oder Werttyp enthält.

Weitere Informationen finden Sie unter dem Bindungsunterstützung für das minOccurs-Attribut-Attribut.

name

Beim Generieren von Quellcode aus einem XSD-Dokument stellt der Wert des name-Attributs den Namen des öffentlichen Klassenfelds dar, das dieses Element darstellt. Wenn das <element>-Element eine anonyme <complexType>-Definition enthält, wird der Name in den Namen der Klasse geändert, die dem komplexen Typ entspricht.

Es wird nicht versucht, die Groß-/Kleinschreibung zu ändern, um die Codierungskonventionen zu befolgen. Wenn das name-Attribut eines <element>, das eine anonyme komplexe Typdefinition enthält, beispielsweise den Wert testInfo hat, erhält die resultierende Klasse den Namen testInfo und nicht TestInfo beginnend mit einem Großbuchstaben. Wenn ein Name mit einem reservierten Schlüsselwort in Konflikt steht, ist dem sich ergebenden Namen das Symbol @ vorangestellt.

Beim Generieren einer <element>-Deklaration aus einem öffentlichen Klassenfeld verwendet Xsd.exe den Feldnamen für den Wert des name-Attributs. Ein alternativer Name, der name-Attributwert, kann über die folgenden Attributeigenschaften angegeben werden:

Weitere Informationen finden Sie in den Ausführungen zum Bindungsunterstützung für das name-Attribut-Attribut.

nillable

Das Tool Xsd.exe setzt das nillable-Attribut mit der IsNullable-Eigenschaft bestimmter mit XML-Serialisierung zusammenhängender Attribute gleich, die auf Verweistypen angewendet werden. Wenn der nillable-Wert für Werttypen true lautet, werden Typen generiert, die auf NULL festgelegt werden können.

Weitere Informationen finden Sie in den Ausführungen zum nillable-Attribut. Das nillable-Attribut tritt nur im <element>-Element auf.

ref

Beim Generieren eines .NET Framework-Typs aus einem komplexen XML-Schematyp unterscheidet Xsd.exe nicht zwischen einem lokal deklarierten Element und einem Verweis auf ein global deklariertes Element, sofern das global deklarierte Element nicht in einem anderen Namespace als dem Zielnamespace des Schemas deklariert wird.

Siehe die Abschnitte Verweis innerhalb desselben Namespaces und Verweis auf einen anderen Namespace.

substitutionGroup

Das Tool Xsd.exe erkennt Ersatzgruppen nur dann, wenn das ersetzte Element abstrakt deklariert ist. Bei einer umgekehrten Übersetzung erstellt Xsd.exe dann ein <choice>-Element, das für jede Ersetzung ein <element>-Element enthält.

Siehe den vorangehenden Abschnitt, SubstitutionGroup-Attribut.

type

Das Tool Xsd.exe verknüpft Datentypen, auf die mit dem type-Attribut von <attribute>-Deklarationen und <element>-Deklarationen verwiesen wird, mit .NET Framework-Typen.

Xsd.exe generiert keinen .NET Framework-Typ für einen XML-Schemadatentyp, es sei denn, der Datentyp kann auf eine globale Elementdeklaration zurückgeführt werden, die über das type-Attribut auf einen Datentyp verweist (möglicherweise einen anderen).

Mögliche übergeordnete Elemente: <all>, <choice>, <schema>, <sequence>

Mögliche untergeordnete Elemente: <annotation>, <complexType>, <key>, <keyref>, <simpleType>, <unique>

Siehe auch

Referenz

XmlSchemaElement

Footer image

Copyright © 2007 by Microsoft Corporation. Alle Rechte vorbehalten.