Supporto dell'associazione all'attributo mixed
In .NET Framework è incluso un supporto parziale per l'associazione all'attributo mixed.
Per la definizione dei tipi complessi mediante estensione, lo strumento Xsd.exe considera un attributo XML mixed="true"
equivalente a un campo di una matrice di stringa con l'attributo XmlTextAttribute applicato.
Descrizione
L'attributo mixed può essere visualizzato negli elementi complexType e complexContent. Il valore true
indica che l'elemento può contenere elementi figlio o testo del corpo (letteralmente, dati di carattere non tipizzati) o una combinazione di entrambi.
Il valore mixed per <complexContent> esegue l'override del valore mixed per <complexType>, in base allo schema XML. Quando è specificato, l'elemento <complexContent> è l'unico elemento figlio dell'elemento <complexType>.
Xsd.exe esegue il mapping di un'impostazione true
per l'attributo mixed a una campo di una matrice di stringa con un attributo System.Xml.Serialization.XmlTextAttribute nel modo seguente:
[System.Xml.Serialization.XmlTextAttribute()]
public string[] Text;
L'attributo XmlText indica alla classe XmlSerializer di serializzare un membro di classe come testo del corpo. L'associazione funziona sia quando un file xsd viene generato dalle classi che quando il codice sorgente viene generato da un file xsd.
Derivazione dei tipi per estensione
La specifica dello schema XML non consente il passaggio da un contenuto misto a un contenuto di soli elementi e viceversa mediante estensione:
Lo schema XML impedisce la creazione di tipi complessi con contenuto misto mediante l'estensione di tipi complessi con elementi figlio non misti.
Analogamente, lo schema XML impedisce la creazione di tipi complessi con elementi figlio non misti mediante l'estensione dei tipi complessi con contenuto misto.
Se viene rilevata una di queste estensioni non valide durante la generazione di codice sorgente da un documento dello schema XML, viene emesso il seguente avviso:
Avviso di convalida schema: il tipo derivato e il tipo di base devono avere lo stesso tipo di contenuto.
Allo stesso tempo, Xsd.exe colloca il campo della matrice di stringa descritto in precedenza con l'attributo XmlText nella classe derivata in cui viene introdotto il contenuto misto. Di conseguenza il contenuto delle derivazioni sarà misto.
L'avviso precedente viene emesso quando un tipo complesso predecessore include elementi figlio e un tipo complesso derivato specifica mixed="true"
. Viene inoltre emesso quando un tipo complesso predecessore specifica un valore true
per l'attributo mixed e un tipo complesso derivato non specifica in modo esplicito un valore true
nell'elemento <complexContent> o <complexType>.
In generale, quando si genera un documento dello schema XML da un set di classi di un assembly, Xsd.exe imposta l'attributo mixed su true
nei seguenti elementi:
<complexType>: per il tipo complesso in cui viene introdotto il contenuto misto. Il tipo corrisponde alla classe contenente il campo della matrice di stringa con un attributo XmlText. Perché il tipo di dati sia valido, non è necessario che corrisponda al tipo complesso di base dello schema, come illustrato successivamente in questo argomento.
<complexContent>: per i tipi complessi derivati.
Anche in questo caso, quando utilizza un documento dello schema XML, Xsd.exe accetta l'impostazione <complexType mixed="true">
per indicare il contenuto misto ereditato per i tipi derivati, anche quando l'impostazione <complexContent mixed="false">
predefinita dovrebbe eseguirne l'override. Durante la conversione inversa dal codice generato, la forma prevista viene ripristinata nel modo seguente:
<complexType>
<complexContent mixed="true">
...
</complexContent>
</complexType>
L'unica situazione in cui è possibile introdurre contenuto misto in un tipo complesso derivato è quando il tipo complesso di base non contiene elementi figlio (può contenere attributi). Si tratta, tuttavia, anche dell'unica situazione in cui Xsd.exe produce in una conversione di andata e ritorno uno schema XML con un significato differente.
Il tipo derivato che introduce contenuto misto deve essere specificato nel modo seguente:
<complexType>
<complexContent mixed="true">
...
</complexContent>
</complexType>
Durante la conversione inversa, Xsd.exe alterna la posizione di mixed="true"
, come illustrato nel frammento di codice seguente:
<complexType mixed="true">
<complexContent mixed="false">
...
</complexContent>
</complexType>
In questo contesto, in base allo schema XML, si suppone che il valore false
dell'elemento <complexContent> esegua l'override del valore true
dell'elemento <complexType>, modificando il contenuto del tipo derivato in un contenuto non misto e contraddicendo lo scopo originale.
L'errore si verifica in quanto, per il tipo complesso in cui viene introdotto il contenuto misto, Xsd.exe imposta sempre l'attributo mixed su true
nell'elemento <complexType> e non nell'elemento <complexContent>, qualora presente.
Inoltre, quando Xsd.exe riceve questo output inverso come input, interpreta in modo coerente che il tipo derivato introduce contenuto misto impostando il campo della matrice di stringa con l'attributo XmlText come membro della classe corrispondente. Come osservato in precedenza, Xsd.exe accetta <complexType mixed="true">
per indicare il contenuto misto ereditato per i tipi derivati, anche quando l'impostazione <complexContent mixed="false>
dovrebbe eseguirne l'override.
Derivazione dei tipi per restrizione
Lo schema XML consente di limitare i tipi complessi con contenuto misto nella derivazione di tipi complessi con elementi figlio non misti. In .NET Framework, tuttavia, non viene riconosciuta alcuna restrizione per i tipi complessi. In Xsd.exe viene invece creata una classe vuota che eredita dalla classe base. Vedere l'elemento <restriction>.
Elementi contenitori possibili: <complexContent>, <complexType>
Vedere anche
Riferimenti
System.Xml.Schema.XmlSchemaComplexContent.IsMixed
System.Xml.Schema.XmlSchemaComplexType.IsMixed
Copyright © 2007 Microsoft Corporation. Tutti i diritti riservati.