Category: XML

Sep 03 2007

.NET: Leer un XML en C#

El otro día hablamos de como crear y escribir un archivo XML en C#. Pues bien, hoy nos toca hacer lo contrario, leerlo.

La forma de hacerlo es sencilla, utilizaremos el mismo XML que utilizamos en el post anterior, usease, este:

<XClub>
<Pelicula>
<Data Titulo="Garganta Profunda(Deep Throat)" Director="Gerard Damiano" />
</Pelicula>
</XClub>

Para ello no tenemos más que recorrer nodo a nodo el XML e ir leyendo lo que nos interese:

System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
doc.Load(pRutaGuardarXML);
System.Xml.XmlNode primerHijo = doc.SelectSingleNode("./descendant::XClub");
System.Xml.XmlNodeList ListaPelicula = primerHijo.SelectNodes("./descendant::Pelicula");
foreach (System.Xml.XmlNode UnaPeli in ListaPelicula)
{
System.Xml.XmlNodeList DatosPelicula = UnaPeli.SelectNodes("./descendant::Data");
foreach (System.Xml.XmlNode Datos in DatosPelicula)
{
string Titulo = Datos.Attributes["Titulo"].InnerText;
string Director = Datos.Attributes["Director"].InnerText;
}
}

Como veis, primero me creo un objeto System.Xml.XmlDocument en el que cargo el XML con el método Load(string URL). Y como me conozco la estructura del XML, la voy recorriendo y meto los datos que me interesan en un par de variables. Naturalmente, en vez de variables, tendréis que decidir donde almacenar los datos, pero eso ya depende de vuestra aplicación y de como lo estéis desarrollando, que yo, ya ahí, no me meto ;)

¿Que qué es el ./descendant::Pelicula? Os habéis fijau, eh? jiji. Pues es la forma de decirle que recorra el interior del nodo que le indiquemos de forma recursiva y me coja todos los nodos dentro de ese nodo de un nombre determinado. En el primer caso le indicamos que me coja el nodo XClub (es el nodo padre, por lo que sólo hay un nodo con ese nombre) que halla dentro del objeto System.Xml.XmlDocument doc poniéndolos en el objeto System.Xml.XmlNode primerHijo, y luego dentro de este, usea, en el nodo XClub, que me coja todos los nodos Pelicula, poniéndolos en el objeto System.Xml.XmlNodeList ListaPelicula, la cual recorreremos para… bueno, creo que ya cogéis por donde va el asunto.

Dudas, preguntas, bugs… en comentarios ;)

Aug 22 2007

.NET: Crear un archivo XML en C#

En el curso, estamos haciendo una aplicación en la que guardamos los datos en un fichero XML (sí, para guardar datos mejor utilizar el SQLServer o análogos, pero el objetivo no es la aplicación en sí, sino aprender a escribir y leer archivos XML desde C#).

La forma de guardar archivos XML con el formato que queremos es el siguiente, aunque, antes de empezar, un pequeño apunte: La estructura de un archivo XML es jerárquica, en forma de arbol, y, como prerequisito, un archivo XML sólo puede contener un nodo padre, en el cual estarán todos los nodos hijos que queramos. Una vez aclarado esto, sigamos.

El código que vereís un poco más abajo tiene como objetivo crear un archivo XML que sea tal que asi:

<XClub>
<Pelicula>
<Data Titulo="Garganta Profunda(Deep Throat)" Director="Gerard Damiano" />
</Pelicula>
</XClub>

Pues bien, aquí teneis el código en C# que crea el documento XML que queremos:

System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
System.Xml.XmlNode XClub = doc.CreateElement("XClub");
doc.AppendChild(XClub);
System.Xml.XmlNode Pelicula = doc.CreateElement("Pelicula");
XClub.AppendChild(Pelicula);
System.Xml.XmlNode Data = doc.CreateElement("Data");
System.Xml.XmlAttribute atributo = doc.CreateAttribute("Titulo");
atributo.InnerText = "Garganta Profunda(Deep Throat)";
Data.Attributes.Append(atributo);
System.Xml.XmlAttribute atributo2 = doc.CreateAttribute("Director");
atributo2.InnerText = "";
Data.Attributes.Append(atributo2);
Pelicula.AppendChild(Data);
doc.Save(pRutaGuardarXML);

Si os fijais, aunque he ido creando los nodos y atributos del XML de forma ordenada, la creación de estos es independiente al diseño, es decir, si quisiese hubiese podido, primero, crearme todos los nodos y atributos del XML y, despues, decir quien pertenece a quien, por lo que el código quedaría de la siguiente forma:

//Me creo los nodos y los atributos
System.Xml.XmlDocument doc = new
System.Xml.XmlDocument();
System.Xml.XmlNode XClub = doc.CreateElement("XClub");
System.Xml.XmlNode Pelicula = doc.CreateElement("Pelicula");
System.Xml.XmlNode Data = doc.CreateElement("Data");
System.Xml.XmlAttribute atributo = doc.CreateAttribute("Titulo");
atributo.InnerText = "Garganta Profunda(Deep Throat)";
System.Xml.XmlAttribute atributo2 = doc.CreateAttribute("Director");
atributo2.InnerText = "Gerard Damiano";

//Y ahora los ordeno como me salga de los webs
doc.AppendChild(XClub);
XClub.AppendChild(Pelicula);
Data.Attributes.Append(atributo);
Data.Attributes.Append(atributo2);
Pelicula.AppendChild(Data);
doc.Save(pRutaGuardarXML);

Es decir, la creación de los elementos es independiente a como vayamos a estructurar el archivo XML (aunque para una claridad mayor y por razones lógicas, lo hagamos de una forma ordenada, sobretodo, si creamos los nodos a partir de colecciones, arrays, listas o lo que hallamos utilizado, recorriendo dichos objetos con un foreach), por lo que ambos ejemplos de código generaran el mismo archivo XML.

Cualquier duda, pregunta, corrección (que naide es perfesto), crítica, bug… en los comentarios ;)