Condividi tramite


Supporto dell'associazione all'attributo default

In .NET Framework è incluso un supporto parziale per l'associazione all'attributo default.

Lo strumento Xsd.exe considera un valore predefinito di elemento o attributo equivalente a un attributo System.ComponentModel.DefaultValueAttribute applicato a un campo generato. Il campo viene anche inizializzato in modo statico sul valore predefinito.

Descrizione

L'attributo default, che può essere visualizzato in una dichiarazione <element> o <attribute>, fornisce un valore predefinito da utilizzare se l'elemento è vuoto o se l'attributo è assente quando si riceve un documento di istanza.

Per gli attributi, un valore predefinito è rilevante solo se un attributo è facoltativo, ovvero se l'attributo use, descritto in Supporto dell'associazione all'elemento attribute ha il valore predefinito optional. Per specificare un attributo, è necessario immettere un valore.

Per gli elementi, un valore predefinito viene utilizzato solo se l'elemento viene visualizzato in un documento di istanza senza contenuto. Se l'elemento non viene visualizzato, non verrà compilato.

Quando genera codice sorgente da un documento dello schema XML, Xsd.exe accetta ogni campo corrispondente a un elemento o a un attributo con un valore predefinito e applica un attributo System.ComponentModel.DefaultValueAttribute, passando il valore predefinito come argomento. Inoltre, Xsd.exe inizializza il campo in modo statico sul valore predefinito, come nell'esempio seguente:

[System.ComponentModel.DefaultValueAttribute(-1)]
public int age = -1;

L'attributo predefinito viene ignorato per le matrici (elementi in cui maxOccurs è maggiore di 1).

Supporto dell'associazione per tipo di dati

In base allo schema XML, il valore dell'attributo default deve essere un tipo semplice. Per quasi tutti i tipi semplici, il valore predefinito viene conservato quando si esegue una conversione di andata e ritorno dallo schema XML alle classi e quindi in un nuovo documento dello schema XML.

Un'eccezione è rappresentata dagli elementi o attributi di tipo xsd:base64Binary o xsd:hexBinary. Un attributo DefaultValue non viene applicato al corrispondente campo System.Byte creato.

Un'altra eccezione è costituita dagli attributi dei tipi elenco. Il costrutto <list> viene utilizzato per definire un tipo semplice i cui valori possibili sono una serie delimitata da spazi di valori di un altro tipo semplice. Xsd.exe non genera codice sorgente per gli elementi dei tipi elenco. Per gli elenchi, viene creata una matrice del tipo costitutivo ma il valore predefinito viene convertito in un'istanza di tale tipo e non in una matrice.

Si consideri la seguente dichiarazione <attribute> di input:

<xsd:attribute name="siblings" default="unknown">
  <xsd:simpleType>
    <xsd:list itemType="xsd:string"/>
  </xsd:simpleType>
</xsd:attribute>

Per questa dichiarazione, viene generato il seguente codice sorgente:

[System.Xml.Serialization.XmlAttributeAttribute()]
[System.ComponentModel.DefaultValueAttribute("unknown")]
public string[] siblings = "unknown";

Tale codice sorgente non può essere compilato in quanto non è possibile eseguire implicitamente il cast di tipo di un oggetto String come matrice di oggetti String. Lo stesso errore viene generato per gli elenchi di qualsiasi tipo semplice, inclusi i tipi di enumerazione.

Effetto prodotto sull'attributo minOccurs per i tipi di valore con associazione di elemento

Si supponga che un membro di classe abbia un tipo di valore .NET Framework ed esegua il mapping a un elemento XML (mediante l'attributo XmlElementAttribute predefinito). Se viene rilevato un attributo DefaultValue applicato a tale membro durante la generazione di un documento XSD dalle classi, viene prodotto il valore 0 per l'attributo minOccurs dell'elemento <element>, a indicare che non è necessario visualizzare l'elemento in un documento di istanza XML valido.

Combinazione con use="optional" per gli attributi

Si supponga che una dichiarazione <attribute> contenga un attributo use con il valore predefinito optional. Durante la generazione di codice sorgente da un documento XSD, questo valore viene interpretato a seconda che l'attributo default sia stato o meno specificato. Le due interpretazioni possibili sono:

  • Se è specificato default: viene generato un campo pubblico con un XmlAttributeAttribute e un DefaultValueAttribute che specifica il valore predefinito.

  • senza la specifica di default: Xsd.exe genera un campo pubblico con un XmlAttributeAttribute. Per i tipi di valori viene, inoltre, generato un campo pubblico del tipo bool il cui nome corrisponde a quello del campo dell'attributo, cui viene aggiunto Specified. Se, ad esempio, il nome del campo dell'attributo è startDate, il nome del campo bool diventerà startDateSpecified. Durante la serializzazione di un oggetto in XML, la classe XmlSerializer controlla il valore del campo bool per stabilire se scrivere o meno l'attributo facoltativo. Il campo bool appare con un System.Xml.Serialization.XmlIgnoreAttribute per impedirne la serializzazione da XmlSerializer.

Esempio

Documento dello schema XLM 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="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>

Classi C# generate dal precedente documento dello schema XML:

[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,
}

Il documento dello schema XML generato da un assembly compilato dal codice sorgente C# precedente è in realtà identico allo schema XML originale dal quale è stato generato il codice sorgente C#.

Elementi contenitore possibili: <attribute>, <element>

Vedere anche

Riferimenti

System.Xml.Schema.XmlSchemaAttribute.DefaultValue
System.Xml.Schema.XmlSchemaElement.DefaultValue

Footer image

Copyright © 2007 Microsoft Corporation. Tutti i diritti riservati.