Condividi tramite


Supporto dell'associazione all'elemento ComplexType

Questo argomento è specifico di una tecnologia legacy. Servizi Web XML e client di servizi Web XML devono essere creati attualmente tramite Windows Communication Foundation.

In .NET Framework è incluso un supporto per l'associazione all'elemento <complexType>.

Lo strumento Xsd.exe considera i tipi complessi di XML Schema equivalenti ai tipi .NET Framework in cui proprietà o campi pubblici rappresentano il contenuto dei tipi complessi.

Descrizione

Lo strumento Xsd.exe considera i tipi complessi di XML Schema equivalenti ai tipi .NET Framework i cui campi pubblici rappresentano il contenuto dei tipi complessi.

Attributo abstract

Un tipo complesso viene dichiarato astratto (abstract="true") per garantire che in un documento conforme agli standard XML vengano visualizzate solo istanze di tipi derivati, non istanze del tipo di base astratto.

Xsd.exe considera un tipo complesso astratto equivalente a una classe abstract. La conversione tra il codice e i documenti XSD funziona in entrambe le direzioni.

Ad eccezione dell'utilizzo della parola chiave abstract, la classe abstract viene trattata come classe base non abstract. Le classi figlio estendono la classe base. Xsd.exe applica alla classe abstract un solo System.Xml.Serialization.XmlIncludeAttribute per ciascuna classe discendente. Ogni attributo XmlInclude specifica il tipo di classe discendente.

Esempio: attributo abstract

Nell'esempio di codice riportato di seguito viene illustrato l'utilizzo dell'attributo abstract con l'elemento <complexType>.

Documento XLM Schema di input:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
         targetNamespace="http://example.org/" xmlns="http://example.org/" elementFormDefault="qualified">
  <xsd:element name="FamilyNode" type="FamilyNodeType" />
  <xsd:complexType name="FamilyNodeType">
    <xsd:sequence>
      <xsd:element name="Code" type="xsd:string" />
      <xsd:element name="Parent" type="Parent" />
    </xsd:sequence>
  </xsd:complexType>
  <xsd:complexType name="Daughter">
    <xsd:complexContent>
      <xsd:extension base="Parent">
        <xsd:sequence>
          <xsd:element name="Date" type="xsd:dateTime" minOccurs="0"/>
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:complexType name="Son">
    <xsd:complexContent>
      <xsd:extension base="Parent">
        <xsd:sequence>
          <xsd:element name="Info" type="xsd:string" minOccurs="0"/>
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:complexType name="Parent" abstract="true">
    <xsd:sequence>
      <xsd:element name="Text" type="xsd:normalizedString" />
    </xsd:sequence>
  </xsd:complexType>
  <xsd:complexType name="Grandchild">
    <xsd:complexContent>
      <xsd:extension base="Daughter">
        <xsd:attribute name="Parent" type="xsd:normalizedString" />
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
</xsd:schema>

Classi C# generate dal precedente documento XML Schema:

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("FamilyNode", Namespace="http://example.org/", IsNullable=false)]
public class FamilyNodeType {
        
    public string Code;
        
    public Parent Parent;
}
    
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(Son))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(Daughter))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(Grandchild))]
public abstract class Parent {
    [System.Xml.Serialization.XmlElementAttribute(DataType="normalizedString")]
    public string Text;
}
    
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
public class Son : Parent {        
    public string Info;
}
    
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(Grandchild))]
public class Daughter : Parent {
        
    public System.DateTime Date;
        
    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public bool DateSpecified;
}
    
 [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
public class Grandchild : Daughter {        
    [System.Xml.Serialization.XmlAttributeAttribute("Parent", DataType="normalizedString")]
    public string Parent1;
}

Lo schema XML generato dalle classi compilate del codice sorgente C# precedente equivale allo schema XML originale.

Attributi possibili Supporto per l'associazione

abstract

L'utilità Xsd.exe considera un tipo complesso astratto, identificato da abstract="true", equivalente a una classe abstract. Per ogni classe che eredita dalla classe abstract, Xsd.exe applica alla classe abstract un System.Xml.Serialization.XmlIncludeAttribute che specifica il tipo della classe discendente.

Vedere la sezione precedente, Abstract Attribute.

block

È possibile applicare l'attributo block a un tipo di dati per evitare che i tipi derivati sostituiscano il tipo originale in cui è specificato l'originale.

Lo strumento Xsd.exe ignora l'attributo block, nonché l'attributo blockDefault dell'elemento Supporto dell'associazione all'elemento Schema.

final

È possibile applicare l'attributo final a un tipo di dati per evitare che venga derivato.

Xsd.exe ignora l'attributo final, nonché l'attributo finalDefault dell'elemento <schema>.

id

L'utilità Xsd.exe ignora l'attributo id che fornisce un identificatore univoco. mentre riconosce l'attributo name.

mixed

Vedere l'attributo mixed.

name

Il valore dell'attributo name diventa il nome del tipo .NET Framework generato da Xsd.exe dal tipo complesso.

Non viene eseguito alcun tentativo di modifica della combinazione di lettere maiuscole/minuscole al fine di rispettare le convenzioni di codifica. Se, ad esempio, il valore dell'attributo name di un elemento <complexType> è testInfo, la classe risultante verrà denominata testInfo, non TestInfo. Se un nome è in conflitto con una parola chiave riservata, il nome risultante sarà preceduto dal simbolo @.

Quando Xsd.exe genera una definizione <complexType> da una classe, utilizza il nome della classe per il valore dell'attributo name. È possibile indicare un nome alternativo, ovvero il valore dell'attributo name, mediante la proprietà TypeName.

Vedere l'attributo Supporto dell'associazione all'attributo name.

Elementi padre possibili: <element>, <redefine>, <schema>

Elementi figlio possibili: <all>, <annotation>, <anyAttribute>, <attribute>, <attributeGroup>, <choice>, <complexContent>, <group>, <sequence>, <simpleContent>

Vedere anche

Riferimento

XmlSchemaComplexType