Classe System.Xml.XmlTextWriter

Questo articolo fornisce osservazioni supplementari alla documentazione di riferimento per questa API.

La XmlTextWriter classe implementa la XmlWriter classe .

Nota

È consigliabile creare XmlWriter istanze usando il XmlWriter.Create metodo e la XmlWriterSettings classe per sfruttare le nuove funzionalità.

XmlTextWriter gestisce uno stack di spazi dei nomi corrispondente a tutti gli spazi dei nomi definiti nello stack di elementi corrente. È XmlTextWriter possibile 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 genera l'output seguente. XmlTextWriter promuove la dichiarazione dello spazio dei nomi all'elemento radice per evitare che venga duplicata sui due elementi figlio. Gli elementi figlio prelevano il prefisso dalla dichiarazione dello spazio dei nomi.

<root xmlns:x="urn:1">
<x:item/>
<x:item/>
</x:root>

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 da "abc" per produrre l'elemento <x:node xmlns:x="abc"/>XML .

w.WriteStartElement("x","node","123");
w.WriteAttributeString("xmlns","x",null,"abc");

Utilizzando i metodi di scrittura che accettano un prefisso come argomento, è anche possibile specificare il prefisso da usare. Nell'esempio seguente vengono mappati due prefissi diversi allo stesso URI dello spazio dei nomi per produrre il testo <x:root xmlns:x="urn:1"><y:item xmlns:y="urn:1"/></x:root>XML .

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 sono presenti più dichiarazioni dello spazio dei nomi che eseguono il mapping di prefissi diversi allo stesso URI dello spazio dei nomi, XmlTextWriter scorre lo stack di dichiarazioni dello spazio dei nomi indietro e sceglie quello 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 C# precedente, poiché la WriteAttributeString chiamata non specifica un prefisso, il writer usa l'ultimo prefisso inserito nello stack dello spazio dei nomi e produce il codice XML seguente:

<x:root xmlns:x="urn:1">
<y:item y:attr="123" xmlns:y="urn:1" />
</x:root>

Se si verificano conflitti tra spazi dei nomi, XmlTextWriter li risolve generando prefissi alternativi. Ad esempio, se un attributo e un elemento hanno lo stesso prefisso ma spazi dei nomi diversi, XmlWriter genera un prefisso alternativo per l'attributo. I prefissi generati sono denominati n{i} dove i è un numero che inizia da 1. Il numero viene reimpostato su 1 per ogni elemento.

Gli attributi associati a un URI dello spazio dei nomi devono avere un prefisso (gli spazi dei nomi predefiniti non si applicano agli attributi). Questo comportamento è conforme alla sezione 5.2 della raccomandazione Spazi dei nomi W3C in XML. Se un attributo fa riferimento a un URI dello spazio dei nomi, ma non specifica un prefisso, il writer genera un prefisso per l'attributo.

Quando si scrive un elemento vuoto, viene aggiunto uno spazio aggiuntivo tra il nome del tag e il tag di chiusura, ad esempio <item />. Ciò garantisce la compatibilità con i browser meno recenti.

Quando un String oggetto viene usato come parametro null del metodo e String.Empty sono equivalenti. String.Empty segue le regole W3C.

Per scrivere dati fortemente tipizzato, usare la XmlConvert classe per convertire i tipi di dati in stringhe. Ad esempio, il codice C# seguente converte i dati da Double a String e scrive 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 attributi e degli elementi.
  • Caratteri Unicode che non rientrano nella codifica specificata. Se i caratteri Unicode non rientrano nella codifica specificata, non esegue l'escape XmlTextWriter dei caratteri Unicode in entità di caratteri.
  • Attributi duplicati.
  • Caratteri nell'identificatore pubblico o nell'identificatore di sistema DOCTYPE.

Considerazioni sulla sicurezza

Gli elementi seguenti sono aspetti da considerare quando si lavora con la XmlTextWriter classe .

  • Le eccezioni generate da XmlTextWriter possono divulgare informazioni sul percorso che non si desidera visualizzare nell'applicazione. Le applicazioni devono intercettare le eccezioni ed elaborarle in modo adeguato.

  • Quando si passa il tipo XmlTextWriter a un'altra applicazione, il flusso sottostante è esposto all'applicazione. Se si deve passare l'oggetto XmlTextWriter a un'applicazione con attendibilità parziale, è invece necessario utilizzare un oggetto XmlWriter creato dal metodo Create.

  • non XmlTextWriter convalida i dati passati ai WriteDocType metodi o WriteRaw . Non è consigliabile passare dati arbitrari a questi metodi.

  • Se le impostazioni predefinite vengono modificate, non vi è alcuna garanzia che l'output generato sia di dati XML ben formati.

  • Non accettare componenti di supporto, ad esempio un Encoding oggetto, da un'origine non attendibile.