Supporto dell'associazione all'elemento any
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 parziale per l'associazione all'elemento <any>.
Durante la generazione di codice sorgente da un documento XML Schema, Xsd.exe traduce l'elemento <any> in un campo di tipo XmlElement, con un attributo XmlAnyElementAttribute.
Descrizione
Il carattere jolly <any> consente la visualizzazione di qualsiasi elemento, ovvero un elemento con qualsiasi nome o di qualsiasi tipo, nella posizione specificata all'interno di un documento dell'istanza XML, con alcune limitazioni.
Durante la generazione di codice sorgente da un documento XML Schema, Xsd.exe traduce l'elemento <any> in un campo di tipo XmlElement, con un attributo XmlAnyElementAttribute. Tale attributo consente la rappresentazione degli elementi XML arbitrari in una classe senza associarli ai tipi non XML identificati da altri possibili campi o proprietà della classe.
Se l'elemento <any> viene visualizzato con un attributo maxOccurs il cui valore è maggiore di 1 o unbounded
, Xsd.exe produce una matrice XmlElement con un attributo XmlAnyElement. Viene prodotta un'unica matrice XmlElement quando il valore dell'attributo maxOccurs è 1
(valore predefinito) oppure 0
. Per informazioni sul rispettivo comportamento, vedere l'attributo maxOccurs.
Durante la generazione di un documento XML Schema da un set di classi di un assembly, Xsd.exe esegue la conversione inversa, ovvero la conversione di un campo o una proprietà del tipo System.Xml.XmlElement con un attributo XmlAnyAttributeAttribute in un elemento <any>.
Attributi namespace e processContents
Durante la generazione delle classi o delle definizioni XML Schema, gli attributi namespace e processContents vengono ignorati. In altri termini, qualunque sia il valore degli attributi in questione in una definizione XML Schema originale, quando Xsd.exe genera classi da tale definizione, quindi genera un altro schema XML da tali classi, l'elemento <any> dello schema XML generato non dispone più di tali attributi. Pertanto l'ultimo schema ripristina i valori predefiniti seguenti:
namespace="##any"
: l'attributo namespace specifica gli spazi dei nomi in cui è necessario definire l'elemento. Il valore##any
consente qualsiasi spazio dei nomi.processContents="strict"
: durante la convalida di un documento di istanza XML per conformità al relativo schema XML specificato, verificare che tutti i tipi di elementi siano convalidati in base agli spazi dei nomi specificati. Se non viene riconosciuto un tipo di elemento, la convalida non riesce.
Analogamente, gli attributi namespace e processContents vengono ignorati anche durante la deserializzazione dai documenti XML agli oggetti. La classe XmlSerializer, invece, si comporta come se i due attributi fossero fissati ai valori seguenti:
namespace="##any"
: è il valore predefinito.processContents="lax"
: quando si convalida un documento di istanza XML per conformità al rispettivo schema XML specificato, convalidare l'elemento solo se è possibile ottenere il relativo spazio dei nomi; in caso contrario assicurarsi che il formato XML di un elemento non riconosciuto sia corretto.
Nota: |
---|
Anche se in fase di esecuzione si presuppone il valore processContents="lax" , in fase di distribuzione .NET Framework genera definizioni XML Schema in cui viene specificato implicitamente il valore processContents="strict" predefinito.
|
Xsd.exe e la classe XmlSerializer forniscono le stesse associazioni per gli attributi namespace e processContents quando vengono visualizzati nell'elemento <anyAttribute>.
Esempio
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="complexInstance" type="MyComplexType"/>
<xsd:complexType name="MyComplexType">
<xsd:sequence>
<xsd:element name="field1" type="xsd:string"/>
<xsd:any namespace="##local" processContents="strict"/>
</xsd:sequence>
</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 string field1;
[System.Xml.Serialization.XmlAnyElementAttribute()]
public System.Xml.XmlElement Any;
}
Tipo complesso di 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="0" maxOccurs="1" name="field1" type="xs:string" />
<xs:any minOccurs="0" maxOccurs="1" />
</xs:sequence>
</xs:complexType>
</xs:schema>
Attributi possibili | Supporto per l'associazione |
---|---|
id |
L'utilità Xsd.exe ignora l'attributo id che fornisce un identificatore univoco. |
maxOccurs |
Vedere la sezione Descrizione in questo argomento. Vedere anche l'attributo Supporto dell'associazione all'attributo MaxOccurs. |
minOccurs |
Durante la generazione di codice sorgente da un documento XML Schema, lo strumento Xsd.exe ignora l'attributo minOccurs se è applicato all'elemento <any>. Durante la generazione di un documento XSD dalle classi, lo strumento Xsd.exe produce un valore pari a Vedere l'attributo Supporto dell'associazione all'attributo MinOccurs. |
namespace |
Vedere la sezione Attributi namespace e processContents in questo argomento. |
processContents |
Vedere la sezione Attributi namespace e processContents in questo argomento. |
Elementi padre possibili: <choice>, <sequence>
Elementi figlio possibili: <annotation>