Clase System.Xml.XmlTextWriter

En este artículo se proporcionan comentarios adicionales a la documentación de referencia de esta API.

La clase XmlTextWriter implementa la clase XmlWriter.

Nota:

Para aprovechar las nuevas funcionalidades se recomienda crear instancias de XmlWriter mediante el método XmlWriter.Create y la clase XmlWriterSettings.

XmlTextWriter mantiene una pila de espacios de nombres correspondiente a todos los espacios de nombres definidos en la pila de elementos actual. XmlTextWriter permite declarar espacios de nombres manualmente.

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();

El código de C# anterior produce el siguiente resultado. XmlTextWriter promueve la declaración del espacio de nombres en el elemento raíz para evitar que se duplique en los dos elementos secundarios. Los elementos secundarios obtienen el prefijo de la declaración del espacio de nombres.

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

XmlTextWriter también permite reemplazar la declaración del espacio de nombres actual. En el ejemplo siguiente, el identificador URI del espacio de nombres "123" se reemplaza por "abc" para generar el elemento XML <x:node xmlns:x="abc"/>.

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

El uso de los métodos de escritura que toman un prefijo como argumento permite especificar también el prefijo que se va a usar. En el ejemplo siguiente, se asignan dos prefijos diferentes al mismo identificador URI del espacio de nombres para generar el texto 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();

Si hay varias declaraciones del espacio de nombres que asignan prefijos diferentes al mismo identificador URI del espacio de nombres, XmlTextWriter recorre la pila de ellas hacia atrás y elige la más cercana.

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();

En el ejemplo de C# anterior, como la llamada WriteAttributeString no especifica ningún prefijo, el escritor usa el último que se ha insertado en la pila del espacio de nombres y genera el siguiente XML:

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

Si se producen conflictos del espacio de nombres, XmlTextWriter los resuelve mediante la generación de prefijos alternativos. Por ejemplo, si un atributo y un elemento tienen el mismo prefijo pero espacios de nombres diferentes, XmlWriter genera un prefijo alternativo para el atributo. Los prefijos generados se denominan n{i}, donde i es un número a partir de 1. El número se restablece a 1 en todos los elementos.

Los atributos asociados a un identificador URI de espacio de nombres deben tener un prefijo (los espacios de nombres predeterminados no se aplican a los atributos). De esta forma se cumple lo que se establece en la sección 5.2 de los espacios de nombres W3C en la recomendación XML. Si un atributo hace referencia a un identificador URI de espacio de nombres, pero no especifica un prefijo, el escritor genera un prefijo para el atributo.

Si se escribe un elemento vacío, se agrega un espacio adicional entre el nombre de la etiqueta y la etiqueta de cierre, por ejemplo <item />. Así se logra compatibilidad con exploradores anteriores.

Cuando String se usa como parámetro del método, null y String.Empty son equivalentes. String.Empty sigue las reglas de W3C.

Para escribir datos fuertemente tipados, use la clase XmlConvert para convertir los tipos de datos en cadena. Por ejemplo, el siguiente código de C# convierte los datos de Double en String y escribe el elemento <price>19.95</price>.

Double price = 19.95;
writer.WriteElementString("price", XmlConvert.ToString(price));

XmlTextWriter no comprueba lo siguiente:

  • Caracteres no válidos en nombres de atributo y de elemento.
  • Caracteres Unicode que no se ajustan a la codificación especificada. Si los caracteres Unicode no se ajustan a la codificación especificada, XmlTextWriter no usa los caracteres Unicode como escape en entidades de caracteres.
  • Atributos duplicados.
  • Caracteres en el identificador público o el identificador del sistema DOCTYPE.

Consideraciones sobre la seguridad

Los siguientes elementos se deben tener en cuenta al trabajar con la clase XmlTextWriter.

  • Las excepciones producidas por XmlTextWriter pueden revelar información sobre la ruta de acceso que no desea propagar a la aplicación. Las aplicaciones deben detectar las excepciones y procesarlas de la manera correspondiente.

  • Cuando se pasa XmlTextWriter a otra aplicación, la secuencia subyacente queda expuesta a esa aplicación. Si necesita pasar el objeto XmlTextWriter a una aplicación de confianza parcial, debería utilizar en su lugar un objeto XmlWriter creado por el método Create.

  • XmlTextWriter no valida los datos que se pasan a los métodos WriteDocType o WriteRaw. No se deben pasar datos arbitrarios a estos métodos.

  • Si se cambia la configuración predeterminada, no hay ninguna garantía de que la salida generada sean datos XML con formato correcto.

  • No admita componentes auxiliares como, por ejemplo, un objeto Encoding, de un origen que no sea de confianza.