Condividi tramite


Supporto dell'associazione all'elemento attribute

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 <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 XML Schema 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 in una definizione XML Schema mediante l'elemento <import>.

Example

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 XML Schema 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 XML Schema:

[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 XML Schema 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 XML Schema di primo livello 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 XML Schema importato 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 XML Schema:

[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 XML Schema di primo livello 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 XML Schema importato 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 XML Schema

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 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.

  • prohibited: Xsd.exe non genera alcun elemento.

Attributo use: generazione di un documento XML Schema 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 di XML Schema 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:

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

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 optional. Per una descrizione completa, vedere l'attributo default.

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:

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

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 di XML Schema, unqualified.

Se una dichiarazione <attribute> in uno schema XML specifica form="qualified", Xsd.exe genera un attributo XmlAttribute per il campo corrispondente e passa all'attributo il parametro Form=XmlSchemaForm.Qualified.

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 di XML Schema, 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 use=“optional”, Xsd.exe verifica la presenza dell'attributo default per stabilire se generare un DefaultValueAttribute oppure un campo –Specified supplementare. Il campo supplementare non viene generato per i tipi di riferimento (ad esempio le stringhe). L'assenza di entrambi per un campo pubblico determina la specifica di use=“required” in un documento XSD generato.

Vedere la sezione precedente, Attributo Use.

Elementi padre possibili: <attributeGroup>, <complexType>, <extension>, <restriction>, <schema>

Elementi figlio possibili: <annotation>, <simpleType>

Vedere anche

Riferimento

XmlSchemaAttribute