Freigeben über


Bindungsunterstützung für das attribute-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 stellt Bindungsunterstützung für das <attribute>-Element bereit.

Xsd.exe unterscheidet jedoch nicht zwischen einem lokal deklarierten Attribut und einem Verweis auf ein global deklariertes Attribut, sofern das globale Attribut nicht in einem anderen Namespace als dem Zielnamespace des Schemas deklariert wird.

Erklärung

Die XML-Schemaspezifikation gibt an, dass ein Attribut innerhalb einer komplexen Typdefinition lokal deklariert werden kann. In diesem Fall kann von einer oder mehreren komplexen Typdefinitionen über das ref-Attribut darauf verwiesen werden.

Es folgt ein Beispiel eines lokal deklarierten Attributs:

<xsd:complexType name="PurchaseOrderType">
  <xsd:sequence>
    <xsd:element name="field1" type="xsd:string"/>
  </xsd:sequence>
  <xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>

Es folgt ein Beispiel desselben Attributs, das global deklariert und auf das dann verwiesen wird:

<xsd:attribute name="name" type="xsd:string"/>
<xsd:complexType name="PurchaseOrderType">
  <xsd:sequence>
    <xsd:element name="field1" type="xsd:string"/>
  </xsd:sequence>
  <xsd:attribute ref="name"/>
</xsd:complexType>

Xsd.exe unterscheidet nicht zwischen einem lokal deklarierten Attribut und einem Verweis auf ein global deklariertes Attribut, sofern das globale Attribut 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 Attribute an Stellen erstellt, an denen zuvor ein globales Attribut und ein Verweis vorhanden waren.

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 XmlAttributeAttribute-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.XmlAttributeAttribute(Namespace="http://example.org/attr")]

public string Key;

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

Example

Dieses erste Beispiel zeigt, wie Xsd.exe ein globales Attribut verarbeitet, wenn dieses Attribut 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:attribute name="version" type="xsd:string"/>
  <xsd:complexType name="keyInfo">
    <xsd:attribute ref="version" />
    <xsd:attribute name="public" type="xsd:boolean" use="required"/>
  </xsd:complexType>
  <xsd:element name="key" type="keyInfo"/>
</xsd:schema>

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

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("key", Namespace="http://example.org/", IsNullable=false)]
public class keyInfo {
        
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string version;
        
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public bool @public;
}

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="key" type="tns:keyInfo" />
  <xs:complexType name="keyInfo">
    <xs:attribute name="version" type="xs:string" />
    <xs:attribute name="public" type="xs:boolean" />
  </xs:complexType>
</xs:schema>

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

Dieses zweite Beispiel zeigt, wie Xsd.exe einen Verweis auf ein globales Attribut verarbeitet, wenn dieses Attribut 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 Speicherort 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:attr="http://example.org/attr">
  <xsd:import  namespace="http://example.org/attr" />
  <xsd:element name="key" type="keyInfo" />
  <xsd:complexType name="keyInfo">
    <xsd:attribute ref="attr:version" />
    <xsd:attribute name="public" type="xsd:boolean" use="required" />
  </xsd:complexType>
</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/attr" targetNamespace="http://example.org/attr">
  <xsd:attribute name="version" type="xsd:string" />
</xsd:schema> 

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

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("key", Namespace="http://example.org/", IsNullable=false)]
public class keyInfo {
        
    [System.Xml.Serialization.XmlAttributeAttribute(Namespace="http://example.org/attr")]
    public string version;
        
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public bool @public;
}

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/attr" />
  <xs:element name="key" type="tns:keyInfo" />
  <xs:complexType name="keyInfo">
    <xs:attribute xmlns:q1="http://example.org/attr" ref="q1:version" />
    <xs:attribute name="public" type="xs:boolean" />
  </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/attr" elementFormDefault="qualified" targetNamespace="http://example.org/attr" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:attribute name="version" type="xs:string" />
</xs:schema>

Use-Attribut

Das use-Attribut einer <attribute>-Deklaration legt fest, ob das Attribut in einem XML-Instanzendokument auftreten darf.

Use-Attribut: Generieren von Quellcode aus einem XML-Schemadokument

Die Interpretation des Werts optional für das use-Attribut durch Xsd.exe hängt davon ab, ob ein Standardattributwert über das default-Attribut festgelegt wurde. Die möglichen Werte für use, einschließlich der Kombinationen mit optional und default, sind im Folgenden mit den entsprechenden Ausgaben durch Xsd.exe aufgeführt:

  • required: Xsd.exe generiert ein öffentliches Feld mit System.Xml.Serialization.XmlAttributeAttribute.

  • optionalmit default angegeben: Xsd.exe generiert ein öffentliches Feld mit XmlAttributeAttribute sowie System.Component.DefaultValueAttribute, das den Standardwert angibt.

  • optional ohne default angegeben: Xsd.exe generiert ein öffentliches Feld mit einem XmlAttributeAttribute. Wenn der Typ des Attributs kein Verweistyp ist (z. B. eine Zeichenfolge), wird außerdem ein öffentliches Feld vom Typ bool generiert, dessen Name dem Namen des Attributfelds mit angehängtem Specified entspricht. Wenn der Name des Attributfelds z. B. startDate ist, lautet der Name des bool-Felds startDateSpecified. 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 System.Xml.Serialization.XmlIgnoreAttribute angezeigt, um zu verhindern, dass es von XmlSerializer serialisiert wird.

  • prohibited: Xsd.exe generiert nichts.

Use-Attribut: Generieren eines XML-Schemadokuments aus Klassen

In den folgenden beiden Fällen gibt Xsd.exe das use-Attribut nicht an und übernimmt den Standardwert optional:

  • Ein zusätzliches öffentliches bool-Feld, das der Specified-Namenskonvention folgt, ist vorhanden.

  • Dem Member wird über ein Attribut des Typs System.Component.DefaultValueAttribute ein Standardwert zugewiesen.

Wenn keine dieser Bedingungen erfüllt ist, erzeugt Xsd.exe für das use-Attribut den Wert required.

Beispiel: Use-Attribut

Komplexen XML-Schemaeingabetyp:

<xsd:complexType name="Numbers">
  <xsd:attribute name="optionalNumber" type="xsd:int" use="optional"/>
  <xsd:attribute name="requiredNumber" type="xsd:int" use="required"/>
  <xsd:attribute name="prohibitedNumber" type="xsd:int" use="prohibited"/>
</xsd:complexType>

Vom vorangehenden komplexen Typ generierte C#-Klasse:

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://example.org/", IsNullable=false)]
public class Numbers {
        
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public int optionalNumber;
        
    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public bool optionalNumberSpecified;
        
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public int requiredNumber;
}

Der von der vorangehenden C#-Klasse generierte komplexe Typ ist dem ursprünglichen komplexen Typ gleichwertig.

Mögliche Attribute Bindungsunterstützung

default

Das default-Attribut stellt einen Standardwert dar, der verwendet wird, wenn das Element leer oder das Attribut beim Empfang eines Instanzendokuments nicht vorhanden ist.

Beim Generieren von Quellcode aus einem XML-Schema wendet das Tool Xsd.exe für jedes Feld, das einem 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)]
[System.Xml.Serialization.XmlAttributeAttribute()]
public int age = -1;

Darüber hinaus überprüft Xsd.exe beim Generieren von Quellcode aus einem Schema, ob das default-Attribut angegeben wurde, um zu ermitteln, wie ein use-Attribut mit dem Wert optional interpretiert werden soll. Eine vollständige Erläuterung finden Sie unter den Ausführungen zum default-Attribut.

Das Tool Xsd.exe generiert keinen gültigen Quellcode für Attribute von Listentypen mit Standardwerten. Dieser Fall wird mit dem default-Attribut beschrieben. Siehe auch die Ausführungen zum <list>-Element.

fixed

Für <attribute>-Deklarationen verwendet Xsd.exe den Wert des fixed-Attributs, um das Feld mit dem fixed-Wert statisch zu initialisieren, wie im folgenden Beispiel dargestellt:

[System.Xml.Serialization.XmlAttribute()]
public in age = -1;

Weitere Informationen finden Sie in den Ausführungen zum fixed-Attribut.

form

Das Tool Xsd.exe setzt das form-XML-Attribut des <attribute>-Elements mit der Form-Eigenschaft von XmlAttributeAttribute gleich. Die XML-Serialisierungsinfrastruktur von .NET Framework erkennt den Standardwert des XML-Schemas, unqualified.

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

Weitere Informationen finden Sie unter form-Attribut.

id

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

name

Beim Generieren von Quellcode aus einem XSD-Dokument stellt der Wert des name-Attributs den Namen des öffentlichen Klassenfelds dar, das dieses Attribut darstellt. Wenn ein Name mit einem reservierten Schlüsselwort in Konflikt steht, ist dem sich ergebenden Namen das Symbol @ vorangestellt.

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

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

ref

Beim Generieren eines .NET Framework-Typs aus einem komplexen XML-Schematyp unterscheidet Xsd.exe nicht zwischen einem lokal deklarierten Attribut und einem Verweis auf ein global deklariertes Attribut, sofern das global deklarierte Attribut 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.

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.

use

Bei use=“optional” überprüft Xsd.exe, ob das default-Attribut vorhanden ist, um zu ermitteln, ob ein DefaultValueAttribute oder ein zusätzliches –Specified-Feld generiert werden soll. Für Verweistypen (z. B. Zeichenfolgen) wird das zusätzliche Feld nicht generiert. Wenn für ein öffentliches Feld keines der beiden vorhanden ist, gibt Xsd.exe in einem generierten XSD-Dokument use=“required” an.

Weitere Informationen finden Sie im vorhergehenden Abschnitt, Use-Attribut.

Mögliche übergeordnete Elemente: <attributeGroup>, <complexType>, <extension>, <restriction>, <schema>

Mögliche untergeordnete Elemente: <annotation>, <simpleType>

Siehe auch

Verweis

XmlSchemaAttribute