Classe XmlTextWriter
Assembly: System.Xml (in system.xml.dll)
Questa classe implementa la classe XmlWriter.
Nota |
|---|
| Nella versione Microsoft .NET Framework versione 2.0 è consigliabile creare istanze di XmlWriter utilizzando il metodo System.Xml.XmlWriter.Create e la classe XmlWriterSettings. In questo modo è possibile sfruttare completamente tutte le nuove funzionalità introdotte in questa versione. Per ulteriori informazioni, vedere Creazione di writer XML. |
La classe XmlTextWriter mantiene uno stack dello spazio dei nomi corrispondente a tutti gli spazi dei nomi definiti nello stack di elementi corrente. È possibile utilizzare XmlTextWriter per dichiarare manualmente gli spazi dei nomi.
w.WriteStartElement("root");
w.WriteAttributeString("xmlns", "x", null, "urn:1");
w.WriteStartElement("item","urn:1");
w.WriteEndElement();
w.WriteStartElement("item","urn:1");
w.WriteEndElement();
w.WriteEndElement();
Il codice C# precedente produce l'output seguente. XmlTextWriter promuove la dichiarazione dello spazio dei nomi nell'elemento di primo livello, al fine di evitarne la duplicazione nei due elementi figlio, il cui prefisso viene ripreso dalla dichiarazione dello spazio dei nomi.
<root xmlns:x="urn:1"> <x:item/> <x:item/> </x:root>
La classe XmlTextWriter consente inoltre di eseguire l'override della dichiarazione dello spazio dei nomi corrente. Nell'esempio seguente l'URI dello spazio dei nomi "123" viene sottoposto a override mediante l'elemento "abc", al fine di produrre l'elemento XML <x:node xmlns:x="abc"/>.
w.WriteStartElement("x","node","123");
w.WriteAttributeString("xmlns","x",null,"abc");
Utilizzando i metodi di scrittura che accettano un prefisso come argomento, è inoltre possibile specificare il prefisso da utilizzare. Nell'esempio seguente due diversi prefissi vengono associati allo stesso URI di spazio dei nomi per produrre il testo XML <x:root xmlns:x="urn:1"><y:item xmlns:y="urn:1"/></x:root>.
XmlTextWriter w = new XmlTextWriter(Console.Out);
w.WriteStartElement("x","root","urn:1");
w.WriteStartElement("y","item","urn:1");
w.WriteEndElement();
w.WriteEndElement();
w.Close();
Se più dichiarazioni dello spazio dei nomi eseguono il mapping di diversi prefissi allo stesso URI dello spazio dei nomi, la classe XmlTextWriter esamina lo stack delle dichiarazioni dello spazio dei nomi precedenti e seleziona il più vicino.
XmlTextWriter w = new XmlTextWriter(Console.Out);
w.Formatting = Formatting.Indented;
w.WriteStartElement("x","root","urn:1");
w.WriteStartElement("y","item","urn:1");
w.WriteAttributeString("attr","urn:1","123");
w.WriteEndElement();
w.WriteEndElement();
w.Close();
Nell'esempio del codice C# precedente la chiamata a WriteAttributeString non specifica alcun prefisso; il writer utilizza pertanto l'ultimo prefisso inserito nello stack dello spazio dei nomi e produce il seguente testo XML:
<x:root xmlns:x="urn:1"> <y:item y:attr="123" xmlns:y="urn:1" /> </x:root>
Gli eventuali conflitti tra gli spazi dei nomi vengono risolti dalla classe XmlTextWriter tramite la generazione di prefissi alternativi. Se ad esempio un attributo e un elemento presentano lo stesso prefisso, ma spazi dei nomi differenti, la classe XmlWriter genererà un prefisso alternativo per l'attributo. I prefissi generati vengono denominati n{i}, dove i è un numero maggiore o uguale a 1. Il numero viene reimpostato su 1 per ciascun elemento.
È necessario che gli attributi associati a un URI dello spazio dei nomi presentino un prefisso. Gli spazi dei nomi predefiniti non sono applicabili agli attributi. Ciò è conforme alla sezione 5.2 delle specifiche W3C Namespaces nelle raccomandazioni XML. Se in un attributo viene fatto riferimento all'URI di uno spazio dei nomi, ma non viene specificato un prefisso, il writer genera un prefisso per l'attributo.
Durante la scrittura di un elemento vuoto, uno spazio supplementare viene aggiunto tra il nome di tag e il tag di chiusura, ad esempio <item />, garantendo la compatibilità con le versioni meno recenti dei browser.
Se come parametro per il metodo si utilizza un oggetto String, riferimento null (Nothing in Visual Basic) e String.Empty sono equivalenti. String.Empty è conforme alle regole W3C.
Per scrivere dati fortemente tipizzati, utilizzare la classe XmlConvert per convertire i tipi di dati in stringa. Il codice C# riportato di seguito consente ad esempio di convertire i dati da Double a String e di scrivere l'elemento <price>19.95</price>.
Double price = 19.95;
writer.WriteElementString("price", XmlConvert.ToString(price));
XmlTextWriter non verifica quanto segue:
-
Caratteri non validi nei nomi degli elementi e degli attributi.
-
Caratteri Unicode non corrispondenti alla codifica specificata. Se i caratteri Unicode non corrispondono alla codifica specificata, l'XmlTextWriter non effettua l'escape dei caratteri Unicode in entità di caratteri.
-
Attributi duplicati.
-
Caratteri contenuti nell'identificatore pubblico DOCTYPE o nell'identificatore di sistema.
Per ulteriori informazioni sulla scrittura di dati XLM, vedere Scrittura di XML con XmlWriter.
Considerazioni sulla protezione
Quando si utilizza la classe XmlTextWriter, è opportuno tenere in considerazione gli elementi riportati di seguito.
-
Le eccezioni generate dalla classe XmlTextWriter possono rivelare informazioni sui percorsi che è preferibile non propagare all'applicazione. Le applicazioni devono intercettare le eccezioni ed elaborarle in modo appropriato.
-
Quando si passa la classe XmlTextWriter a un'altra applicazione, il flusso sottostante viene esposto a tale applicazione. Se è necessario passare la classe XmlTextWriter a un'applicazione semi-trusted, utilizzare invece un oggetto XmlWriter creato dal metodo Create.
-
La classe XmlTextWriter non convalida i dati passati ai metodi WriteDocType o WriteRaw. Non passare dati arbitrari a tali metodi.
-
Se le impostazioni predefinite vengono modificate, non è sicuro che l'output generato sia composto da dati XML in formato corretto.
-
Non accettare componenti di supporto, ad esempio un oggetto Encoding proveniente da un'origine non attendibile.
Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile per Pocket PC, Windows Mobile per Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
.NET Framework non supporta tutte le versioni di ciascuna piattaforma. Per un elenco delle versioni supportate, vedere Requisiti di sistema.
Riferimenti
Membri XmlTextWriterSpazio dei nomi System.Xml
Altre risorse
Documenti e dati XMLProtezione e applicazioni System.Xml
