Lectura de XML con XmlDocument

[forCode]

En el anterior artículo mi compañero Eric Torre, nos explico como leer y escribir xml con el objeto DataSet, algo muy sencillo, ahora veremos como tratar el XmlDocument. Algo más optimo pero acarrea más trabajo.

Con el XmlDocument (como con la mayoría de métodos de lectura de XML) tenemos que saber que estructura tiene el XML.

Lectura

<?xml version="1.0" encoding="UTF-8"?>
<ListaCervezas>
	<Cerveza>
		<Nombre>Bellcebuth</Nombre>
		<Pais>Francia</Pais>
	</Cerveza>
	<Cerveza>
		<Nombre>Judas</Nombre>
		<Pais>Belgica</Pais>
	</Cerveza>
</ListaCervezas>

Para leer dicho XML, podríamos utilizar este código (una simple aplicación de consola nos sirve):

XmlDocument documento = new XmlDocument();
documento.Load("C:\temp\cervezas.xml");

XmlNodeList listaCervezas = documento.GetElementsByTagName("ListaCervezas");
XmlNodeList cervezas = ((XmlElement)listaCervezas[0]).GetElementsByTagName("Cerveza");

foreach (XmlElement cerveza in cervezas)
{
	XmlNodeList nombre = cerveza.GetElementsByTagName("Nombre");
	XmlNodeList pais = cerveza.GetElementsByTagName("Pais");

	Console.WriteLine("Elemento nombre ... {0} {1}", nombre[0].InnerText, pais[0].InnerText);
}

Primero de todo creamos un XMLDocument propio, el cual cargaremos con los datos del XML mediante el método load indicando la ruta de dicho archivo.

Después obtendremos, mediante un objeto XmlNodeList y un metodo GetElementsByTagName señalando el tag «ListaCervezas», la lista de nodos con ese tag.

Antes de terminar mediante el mismo proceso, pero esta vez, en vez de señalar el documento como primer elemento del que obtener información, indicaremos que es nuestra nueva lista de Nodos («listaCervezas»), en la cual tendremos que indicar que queremos el primer elemento [0] ya que sabemos que solo hay una. E indicaremos que queremos obtener todos los nodos con el tag «Cerveza».

Por último, con nuestra lista de cervezas ya definitiva, solo nos quedará recorrerla con un foreach y hacer uso de nuestros amigos GetElementsByTagName() y XmlNodeList.

!OJO¡ Para acceder al contenido tenemos que utilizar un variable[0].InnerText. !OJO¡

También podemos encontrarnos con documentos XML que contengan atributos:

<?xml version="1.0" encoding="UTF-8"? />
<ListaCervezas>
	<Cerveza Nombre="Bellcebuth" Pais="Francia" />
	<Cerveza Nombre="Judas" Pais="Belgica" />
</ListaCervezas>

Para recoger dichos atributos, tendríamos que utilizar GetAttribute() en lugar de GetElementsByTagName().

foreach (XmlElement cerveza in cervezas)
{
	XmlNodeList nombre = cerveza.GetAttribute("Nombre");
	XmlNodeList pais = cerveza.GetAttribute("Pais");

	Console.WriteLine("Elemento nombre ... {0} {1}", nombre, pais);
}

Espero que os sirva de ayuda!