Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este artículo se proporcionan comentarios adicionales a la documentación de referencia de esta API.
La XmlTextWriter clase implementa la XmlWriter clase .
Nota:
Se recomienda crear XmlWriter instancias mediante el XmlWriter.Create método y la XmlWriterSettings clase para aprovechar las nuevas funcionalidades.
XmlTextWriter
mantiene una pila de espacios de nombres correspondiente a todos los espacios de nombres definidos en la pila de elementos actual. Con XmlTextWriter
puede 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 genera la salida siguiente. XmlTextWriter
promociona 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 siguiente ejemplo, el URI del espacio de nombres "123" es reemplazado por "abc" para producir el elemento XML <x:node xmlns:x="abc"/>
.
w.WriteStartElement("x","node","123");
w.WriteAttributeString("xmlns","x",null,"abc");
Mediante el uso de los métodos de escritura que toman un prefijo como argumento, también puede especificar qué prefijo 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 de espacio de nombres que asignan prefijos diferentes al mismo URI de espacio de nombres, XmlTextWriter
recorre la pila de declaraciones de espacio de nombres 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, dado que la WriteAttributeString
llamada no especifica un prefijo, el escritor usa el último prefijo 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 de 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 para cada elemento.
Los atributos asociados a un 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 URI de espacio de nombres, pero no especifica un prefijo, el escritor genera un prefijo para el atributo .
Al escribir un elemento vacío, se agrega un espacio adicional entre el nombre de etiqueta y la etiqueta de cierre, por ejemplo <item />
. Esto proporciona compatibilidad con exploradores anteriores.
Cuando un String
se usa como parámetro de método, null
y String.Empty
son equivalentes. String.Empty
sigue las reglas W3C.
Para escribir datos fuertemente tipados, utilice la XmlConvert clase para convertir tipos de datos en cadena de texto. 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 los nombres de atributo y 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 convierte los caracteres Unicode en entidades de caracteres. - Atributos duplicados.
- Caracteres en el identificador público o el identificador del sistema DOCTYPE.
Consideraciones de seguridad
Los siguientes elementos son aspectos que se deben tener en cuenta al trabajar con la XmlTextWriter clase .
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 excepciones y procesarlas correctamente.
Al pasar XmlTextWriter a otra aplicación, el flujo subyacente queda expuesto a esa aplicación. Si necesita pasar el XmlTextWriter a una aplicación semi-confiable, debe usar un objeto XmlWriter creado por el método Create en su lugar.
XmlTextWriter no valida ningún dato que se pase a los métodos WriteDocType o WriteRaw. No debe pasar datos arbitrarios a estos métodos.
Si se cambia la configuración predeterminada, no hay ninguna garantía de que la salida generada tenga un formato correcto de los datos XML.
No acepte componentes auxiliares, como un Encoding objeto, de un origen que no sea de confianza.