This article is currently in the process of being translated into Spanish (~98% done).
Reading XML with the XmlReader class
Existen principalmente dos métodos para leer XML con C#: con la clase XmlDocument y con la clase XmlReader. XmlDocument lee el contenido completo del XML en memoria y te permite navegar hacia adelante y atrás como lo necesites, o incluso consultar (query) al documento usando la tecnología XPath.
XmlReader es una alternativa más rápida y que consume menos memoria. Te permite recorrer el contenido del XML, un elemento a la vez mientras te permite ver el valor, y después se mueve al siguiente elemento. Al hacerlo así, obviamente consume muy poca memoria porque solo mantiene un elemento a la vez, y como tienes que comprobar manualmente los valores, solo obtendrpas kis ekenebtis relevantes haciéndolo muy rápido. En este capítulo, nos enfocaremos en la clase XmlReader, después veremos la clase XmlDocument en el siguiente capítulo.
Probemos un pequeño ejemplo donde leeremos un documento XML que contiene tasas de cambio de moneda. Afortunadamente para nosotros, el Banco Central Europeo tiene un documento que podemos utilizar. Podríamos descargarlo y leerlo en nuestro disco duro, pero de hecho, tanto la clase XmlReader como la clase XmlDocument pueden leer un documento XML desde una URL remota tan bien como desde un archivo local. Puedes consultar el archivo XML aquí ( http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml) vamos con algo de código y luego su explicación:
using System;
using System.Text;
using System.Xml;
namespace ParsingXml
{
class Program
{
static void Main(string[] args)
{
XmlReader xmlReader = XmlReader.Create("http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml");
while(xmlReader.Read())
{
if((xmlReader.NodeType == XmlNodeType.Element) && (xmlReader.Name == "Cube"))
{
if(xmlReader.HasAttributes)
Console.WriteLine(xmlReader.GetAttribute("currency") + ": " + xmlReader.GetAttribute("rate"));
}
}
Console.ReadKey();
}
}
}
Empezamos creando una instancia de XmlReader, usando el método estático Create(). XmlReader posee muchas sobrecargas, la más simple de ellas sólo requiere una URL apuntando al archivo. En un while loop, llamamos al método Read() de la instancia XmlReader. Este método desplaza al reader al siguiente elemento y retorna true mientras haya más elementos por leer. Dentro del loop, podemos usar una de muchas propiedades y métodos que posee el objeto XmlReader para acceder a los datos del elemento que está siendo leído.
En nuestro caso, verificamos el NodeType para ver si tenemos un Element (la parte del tag) y si el nombre es "Cube". Como puedes ver en el documento, cada tasa de cambio está contenida en un elemento llamado Cube, esto es por su puesto lo que estamos buscando -ignoramos el resto. Una vez tenemos el elemento Cube, realizamos una verificación formal para ver si este tiene atributos (debería tenerlos) y luego usamos el método GetAttribute() para leer los dos valores "currency" y "rate" (moneda y tasa). Imprimimos los valores por la consola y continuamos con el siguiente elemento. El resultado debería ser una lista completa de monedas y su respectiva tasa de cambio actual.
Como puedes ver, esto es muy fácil de hacer, pero es principalmente porque nosotros simplemente necesitamos los datos en el mismo orden en que son leídos, sin hacer nada particular con ellos. En el próximo capítulo, haremos los mismo pero usando la clase XmlDocument, para que puedas ver la diferencia.
Nota: Deberías estar prevenido de que hay muchas maneras en el que el código de arriba podría fallar y arrojar una exepción, la cual deberías por supuesto controlar. Mira el capítulo acerca de las excepciones para mayor información.