XmlTextWriter (escribiendo en ficheros XML)

Tras nuestro anterior artículo sobre XML en el que veíamos cómo leer ficheros XML de forma muy rápida (XmlTextReader), vamos ahora a por su amigo el XmlTextWriter. Recordad que todos ellos los encontraréis en el namespace System.Xml, por lo que convendría que lo importaráis en vuestas clases .

Y es que escribir ficheros XML es muy sencillo con el XmlTextReader, y con ASP.NET 2.0 ahora es mucho más eficiente y rápido de lo que ya lo era con versiones anteriores.

En este artículo vamos a hablar únicamente de cómo escribir un XML únicamente, no hablaremos en ningún momento de la edición de sus ficheros, pues eso formará parte de otros artículos futuros.

Queremos crear el siguiente fichero, con los mejores jugadores jóvenes de la liga española , y guardarlo en la raíz de nuestra aplicación web:

futbolistas.xml
<futbolistas>
    <jugador pais="España">
       <nombre>David Villa</nombre>
       <equipo>Valencia C.F.</nombre>
    </jugador>
    <jugador pais="Argentina">
       <nombre>Leo Messi</nombre>
       <equipo>Barcelona F.C.</equipo>
    </jugador>
</futbolistas>


Así que allá vamos con el código y más tarde con la explicación:

futbolistas.cs
        string path = Server.MapPath("~/futbolistas.xml");
        using (XmlTextWriter writer = new XmlTextWriter(path, Encoding.UTF8))
        {
            writer.Formatting = Formatting.Indented;

            writer.WriteStartDocument();
            writer.WriteStartElement("futbolistas");

            writer.WriteStartElement("jugador");
            writer.WriteAttributeString("pais", "España");
            writer.WriteElementString("nombre", "David Villa");
            writer.WriteStartElement("equipo");
            writer.WriteString("Valencia C.F.");
            writer.WriteEndElement();
            writer.WriteEndElement();


            writer.WriteStartElement("jugador");
            writer.WriteAttributeString("pais", "Argentina");
            writer.WriteElementString("nombre", "Leo Messi");
            writer.WriteStartElement("equipo");
            writer.WriteString("Barcelona F.C.");
            writer.WriteEndElement();
            writer.WriteEndElement();

            writer.WriteEndElement();
            writer.WriteEndDocument();

            writer.Close();
        }



Analicemos paso a paso:
1.- Lo primero que hacemos es inicializar la variable writer y decirle que el resultado lo guarde en el fichero futbolistas.xml de nuestro directorio raíz. No olvidar hacer el Server.MapPath previamente. Utilizamos la sentencia using, que no sirve sólo para el XmlTextWriter sino para casi cualquier tipo de variable, que se encargará de "cerrar todo lo que moleste" al finalizar el trabajo con la variable o en caso de que se produzca un error. En otra ocasión hablaremos de la sentencia using pues es muy interesante.

2.- Aplicando Indented como formato nos aseguramos de que el fichero XML quedará bonito para la vista, con sus saltos de línea y sus tabulaciones que tanto nos gustan a los humanos . Si no indicáramos nada, el fichero XML estaría escrito en toda un línea.

3.- Vayamos con lo interesante: iniciemos el documento. Con writer.WriteStartDocument() lo comenzamos y permitimos que la variable writer pueda comenzar con su faena real, además de añadir al documento la típica línea "<?xml version="1.0" encoding="utf-8"?>". Comprobemos que al final se cierra el documento con  writer.WriteEndDocument().

4.- Creamos la apertura del elemento "futbolistas", que para nuestro ejemplo será el elemento raíz del documento. Compruébese que al final ese elemento se cierra con un writer.WriteEndElement().

5.- Con:
            writer.WriteStartElement("jugador");
            writer.WriteAttributeString("pais", "España");
... estamos abriendo el elemento jugador y le asignamos un atributo llamado "pais" de valor "España". Personalmente no me gusta establecer atributos ningún elemento XML, por lo que no los recomiendo salvo situaciones excepcionales. En este caso lo hacemos con fines didácticos.

6.- Ahora lo que hacemos es crear un elemento llamado "nombre", le damos un valor ("David Villa") y lo cerramos... todo ello en una línea!!
            writer.WriteElementString("nombre", "David Villa");

7.- Para mostrar que se produce el mismo efecto con varias líneas, para definir el equipo del jugador haremos:
            writer.WriteStartElement("equipo");
            writer.WriteString("Valencia C.F.");
            writer.WriteEndElement();
Tanto en 6 como en 7 se hace lo mismo. A mí me gusta más el modo 6 pues es más compacto, pero comprendería que gustara el 7 ya que puede llegar a ser más claro a la hora de leer el código.

8.- Tras cerrar el primer elemento jugador, hacemos los mismo con Leo Messi.

9.- Cerramos el elemento futbolistas, cerramos el documento y cerramos el writer con writer.close(), aunque esto último no es necesario hacerlo pues la sentencia using ya lo hace (de hecho hace un dispose).

Con lo dicho en este artículo, ya sabemos todo lo necesario para escribir un documento XML entero. Ahora cada uno debe adaptarlo a sus necesidades utilizando listados con sus propias clases, datasets o lo que sea!!

PD: Como consejo y/o observación, tened siempre muy en cuenta que XML es CaseSensitive, por lo que una equivocación en mayúsculas y minúsculas puede resultar un dolor de cabeza tan fuerte como innecesario.