Supporto dell'associazione all'elemento attribute
In .NET Framework è incluso un supporto per l'associazione all'elemento ><attribute> .
Xsd.exe, tuttavia, non distingue un attributo dichiarato localmente da un riferimento a un attributo dichiarato globalmente, a meno che l'attributo globale non sia dichiarato in uno spazio dei nomi diverso dallo spazio dei nomi di destinazione dello schema.
Descrizione
La specifica dello schema XML segnala che un attributo può essere dichiarato localmente, all'interno di una definizione di tipo complesso, oppure globalmente. In questo caso è possibile fare riferimento all'attributo mediante una o più definizioni di tipo complesso utilizzando l'attributo ref.
Di seguito è riportato un esempio di attributo dichiarato localmente.
<xsd:complexType name="PurchaseOrderType">
<xsd:sequence>
<xsd:element name="field1" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
Di seguito è riportato un esempio dello stesso attributo dichiarato globalmente a cui, quindi, viene fatto riferimento.
<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 non distingue un attributo dichiarato localmente da un riferimento a un attributo dichiarato globalmente, a meno che l'attributo globale non sia dichiarato in uno spazio dei nomi diverso dallo spazio dei nomi di destinazione dello schema.
Riferimento all'interno dello stesso spazio dei nomi
Dal momento che Xsd.exe non fa distinzioni all'interno dello stesso spazio dei nomi, una riconversione dallo schema XML alle classi e viceversa crea un attributo locale in sostituzione dell'attributo globale e del riferimento.
Riferimento a un altro spazio dei nomi
Se una dichiarazione globale a cui viene fatto riferimento appartiene a uno spazio dei nomi differente, Xsd.exe specifica lo spazio dei nomi utilizzando la proprietà Namespace di un attributo XmlAttributeAttribute applicato al campo generato. Per questo particolare elemento, lo spazio dei nomi specificato mediante la proprietà Namespace esegue l'override dello spazio dei nomi specificato a livello di classe utilizzando l'attributo XmlTypeAttribute e, facoltativamente, XmlRootAttribute. Vedere l'esempio seguente:
[System.Xml.Serialization.XmlAttributeAttribute(Namespace="http://example.org/attr")]
public string Key;
Spazi dei nomi aggiuntivi vengono importati nella definizione dello schema XML utilizzando l'elemento <import>.
Esempio
In questo primo esempio viene illustrato come Xsd.exe elabora un attributo globale quando tale attributo viene definito nello stesso spazio dei nomi di destinazione che contiene un riferimento a esso.
Documento dello schema XML di input:
<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>
Classe C# generata dal precedente documento dello schema XML:
[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;
}
Documento dello schema XML generato da un assembly compilato dal codice sorgente C# precedente:
<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>
Nello schema XML generato precedentemente l'attributo di versione, originariamente dichiarato globalmente, è stato reso locale.
In questo secondo esempio viene illustrato come Xsd.exe elabora un riferimento a un attributo globale quando tale attributo è definito in uno spazio dei nomi separato. Nell'esempio viene utilizzato l'elemento <import> per importare un secondo spazio dei nomi disponibile in un file XSD separato. Per specificare la posizione del file xsd importato non viene utilizzato l'attributo schemaLocation dell'elemento <import>. Per Xsd.exe il file viene invece specificato come argomento aggiuntivo della riga di comando.
Documento di primo livello dello schema XML utilizzato come input:
<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>
Documento importato dello schema XML utilizzato come input:
<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>
Classe C# generata dai due precedenti documenti dello schema XML:
[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;
}
Documento di primo livello dello schema XML generato da un assembly compilato dal codice sorgente C# precedente:
<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>
Documento importato dello schema XML generato da un assembly compilato dal codice sorgente C# precedente:
<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>
Attributo use
L'attributo use di una dichiarazione <attribute> consente di determinare se l'attributo può o deve essere presente in un documento dell'istanza XML.
Attributo use: generazione del codice sorgente da un documento dello schema XML
L'interpretazione di Xsd.exe di un valore optional
per l'attributo use varia a seconda che sia stato specificato un valore di attributo predefinito mediante l'attributo default. I valori possibili per use, comprese le combinazioni di optional
e default, sono elencati insieme ai relativi output Xsd.exe come illustrato di seguito.
required
: Xsd.exe genera un campo pubblico con un attributo System.Xml.Serialization.XmlAttributeAttribute.Se è specificato
optional
con default: viene generato un campo pubblico con un XmlAttributeAttribute e un System.Component.DefaultValueAttribute che specifica il valore predefinito.optional
senza la specifica di default: Xsd.exe genera un campo pubblico con un XmlAttributeAttribute. Inoltre, se il tipo dell'attributo non è un tipo di riferimento (ad esempio una stringa), genera un campo pubblico del tipo bool il cui nome corrisponde al nome del campo dell'attributo cui viene aggiuntoSpecified
. 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.prohibited
: Xsd.exe non genera alcun elemento.
Attributo use: generazione di un documento dello schema XML dalle classi
In uno dei due casi riportati di seguito Xsd.exe non specifica l'attributo use e viene ripristinato il valore predefinito optional
:
È presente un campo pubblico bool supplementare che segue la convenzione di denominazione
Specified
.Al membro viene assegnato un valore predefinito mediante un attributo del tipo System.Component.DefaultValueAttribute.
Se non viene soddisfatta nessuna di queste condizioni, Xsd.exe produce un valore required
per l'attributo use.
Esempio: attributo use
Tipo complesso dello schema XML di input:
<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>
Classe C# generata dal tipo complesso precedente:
[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;
}
Il tipo complesso generato dalla classe C# precedente equivale al tipo complesso originale.
Attributi possibili | Supporto per l'associazione |
---|---|
default |
L'attributo default offre un valore predefinito da utilizzare se l'elemento è vuoto oppure l'attributo non è presente quando viene ricevuto un documento di istanza. Quando genera codice sorgente da uno schema XML, lo strumento Xsd.exe accetta ogni campo corrispondente 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:
Durante la generazione di codice sorgente da uno schema, Xsd.exe controlla anche se l'attributo default è stato specificato per stabilire come interpretare un attributo use con un valore Lo strumento Xsd.exe non riesce a generare codice sorgente valido per gli attributi dei tipi di elenco con i valori predefiniti. Questo caso viene descritto mediante l'attributo default. Vedere anche l'elemento <list>. |
fisso |
Per le dichiarazioni <attribute>, Xsd.exe utilizza il valore dell'attributo fixed per inizializzare in modo statico il campo sul valore fisso, come nell'esempio seguente:
Vedere l'attributo fixed. |
form |
Lo strumento Xsd.exe considera l'attributo XML form dell'elemento <attribute> equivalente alla proprietà Form di XmlAttributeAttribute. L'infrastruttura di serializzazione XML di .NET Framework riconosce il valore predefinito dello schema XML, Se una dichiarazione <attribute> in uno schema XML specifica Vedere l'attributo form. |
id |
L'utilità Xsd.exe ignora l'attributo id che fornisce un identificatore univoco, mentre riconosce l'attributo name. |
name |
Per la generazione di codice sorgente da un documento XSD, il valore dell'attributo name fornisce il nome del campo della classe pubblica che rappresenta quell'attributo. Se un nome è in conflitto con una parola chiave riservata, il nome risultante sarà preceduto dal simbolo @. Quando Xsd.exe genera una dichiarazione <attribute> da un campo di classe pubblica, utilizza il nome del campo per il valore dell'attributo name. È possibile indicare un nome alternativo, ovvero il valore dell'attributo name, mediante la proprietà AttributeName. Vedere l'attributo Supporto dell'associazione all'attributo name. |
ref |
Quando genera un tipo . NET Framework da un tipo complesso dello schema XML, Xsd.exe non distingue un attributo dichiarato localmente da un riferimento a un attributo dichiarato globalmente, a meno che l'attributo globale non sia dichiarato in uno spazio dei nomi diverso dallo spazio dei nomi di destinazione dello schema. Vedere le sezioni Riferimento all'interno dello stesso spazio dei nomi e Riferimento a un altro spazio dei nomi. |
type |
Lo strumento Xsd.exe associa i tipi di dati cui si fa riferimento mediante l'attributo type delle dichiarazioni <attribute> e <element> ai tipi .NET Framework. Xsd.exe non genera un tipo .NET Framework per un tipo di dati dello schema XML, a meno che il tipo di dati non sia riconducibile a una dichiarazione di elemento globale che fa riferimento a un tipo di dati mediante l'attributo type. |
use |
Se Vedere la sezione precedente, Attributo Use. |
Elementi padre possibili: <attributeGroup>, <complexType>, <extension>, <restriction>, <schema>
Elementi figlio possibili: <annotation>, <simpleType>
Vedere anche
Riferimenti
Copyright © 2007 Microsoft Corporation. Tutti i diritti riservati.