Condividi tramite


Supporto dell'associazione all'attributo form

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'attributo form.

Lo strumento Xsd.exe considera l'attributo XML form equivalente alla proprietà Form degli attributi XmlAttribute o XmlElement, sebbene il codice di serializzazione XML di .NET Framework riconosca per gli elementi un diverso valore predefinito, qualified.

Descrizione

XML Schema richiede che tutti gli elementi e gli attributi dichiarati globalmente (come figli dell'elemento <schema>) risultino qualificati come spazi dei nomi in un documento di istanza. Per gli elementi e gli attributi dichiarati localmente, ovvero all'interno di una definizione <complexType>, la qualifica come spazio dei nomi è facoltativa.

Per indicare se assegnare uno spazio dei nomi completo a un determinato elemento o attributo locale, viene aggiunto l'attributo form a una dichiarazione <element> o <attribute> locale. I valori possibili sono qualified e unqualified.

Il valore predefinito dell'attributoform viene ereditato dall'attributo elementFormDefault o attributeFormDefault dell'elemento radice <schema>. Per entrambi gli attributi il valore predefinito è unqualified.

In .NET Framework non esiste la possibilità di specificare l'attributo form a livello globale o di schema all'interno di una definizione di classe. Accade invece che, durante la generazione di un documento XML Schema da un set di classi, Xsd.exe produca sempre uno schema XML che presenta le caratteristiche seguenti:

  • Non specifica attributeFormDefault, ripristinando il valore predefinito unqualified.

  • Specifica elementFormDefault="qualified", utilizzando un valore predefinito diverso da quello di XML Schema.

Xsd.exe risponde ai valori alternativi per attributeFormDefault="qualified" e elementFormDefault="unqualified" impostando il form in base al campo.

A causa di queste limitazioni, Xsd.exe genera codice sorgente dall'attributo form, come illustrato nella tabella riportata di seguito.

attributo form

form="completo"

form="non completo"

<attribute> element

Alla dichiarazione dell'attributo XmlAttribute viene passato un parametro Form=XmlSchemaForm.Qualified.

Alla dichiarazione dell'attributo XmlAttribute per il campo <attribute> non viene passato alcun parametro form.

<element> element

Non viene applicato alcun attributo XmlElement, a meno che non venga passato un parametro non correlato.

Alla dichiarazione dell'attributo XmlElement per il campo <element> viene passato un parametro, Form=XmlSchemaForm.Unqualified.

Il parametro passato alla dichiarazione XmlAttribute o XmlElement imposta la proprietà Form, i cui valori possibili derivano dall'enumerazione XmlSchemaForm:

  • XmlSchemaForm.Qualified

  • XmlSchemaForm.Unqualified

  • XmlSchemaForm.None: valore predefinito

L'attributo form viene specificato solo nel codice sorgente se è impostato sul valore non predefinito nel documento XML Schema originale, in base ai valori predefiniti di .NET Framework in contrapposizione ai valori predefiniti di XML Schema. Dal momento che l'attributo form esegue l'override degli attributi attributeFormDefault e elementFormDefault, uno schema che imposta form su un valore non predefinito a livello di <schema>, quindi lo imposta sul valore predefinito a livello di <attribute> o <element>, produce codice sorgente in cui non è specificato form. In termini di conformità dei documenti di istanza, il significato è sempre lo stesso.

Example

Documento XLM Schema di input:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
            xmlns="http://example.org/" targetNamespace="http://example.org/" elementFormDefault="qualified">
  <xsd:element name="ComplexInstance" type="MyComplexType"/>
  <xsd:complexType name="MyComplexType">
    <xsd:sequence>
      <xsd:element name="elementQ" type="xsd:decimal" form="qualified" />
      <xsd:element name="elementU" type="xsd:Date" form="unqualified" />
    </xsd:sequence>
    <xsd:attribute name="attributeQ" type="xsd:string"  use="required" form="qualified"/>
    <xsd:attribute name="attributeU" type="xsd:boolean" use="required" form="unqualified"/>
  </xsd:complexType>
</xsd:schema>

Classe C# generata dal precedente documento XML Schema:

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("ComplexInstance", Namespace="http://example.org/", IsNullable=false)]
 public class MyComplexType {
        
     public System.Decimal elementQ;
        
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string elementU;
        
    [System.Xml.Serialization.XmlAttributeAttribute(Form=System.Xml.Schema.XmlSchemaForm.Qualified)]
    public string attributeQ;
        
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public bool attributeU;
}

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="ComplexInstance" type="tns:MyComplexType" />
  <xs:complexType name="MyComplexType">
    <xs:sequence>
      <xs:element minOccurs="1" maxOccurs="1" name="elementQ" type="xs:decimal" />
      <xs:element minOccurs="0" maxOccurs="1" form="unqualified" name="elementU" type="xs:string" />
    </xs:sequence>
    <xs:attribute form="qualified" name="attributeQ" type="xs:string" />
    <xs:attribute name="attributeU" type="xs:boolean" use="required" />
  </xs:complexType>
</xs:schema>

Elementi contenitore possibili: <attribute>, <element>

Vedere anche

Riferimento

System.Xml.Schema.XmlSchemaAttribute.Form
System.Xml.Schema.XmlSchemaElement.Form