TOC

This article is currently in the process of being translated into Spanish (~56% done).

XML:

Reading XML with the XmlDocument class

Como se comentó en el capítulo anterior, XmlDocument consume más memoria y es, posiblemente, un poco más lento que XmlReader. Sin embargo, para muchos propósitos, trabajar con XmlDocument puede ser más fácil y a menudo requiere menos código. Una vez que el contenido a sido leído (cargado en memoria), puedes leer los datos de manera jerárquica, justo como la estructura XML, con un elemento raiz que puede tener elementos hijos, que a su vez pueden tener elementos hijos y así sucesivamente. En el capítulo anterior, analizamos datos XML desde el Banco Central Europeo con el cual pudímos averiguar la tasa de cambio actual de la moneda, haremos lo mismo en esta oportunidad, pero esta vez usando la clase XmlDocument.

El XML puede encontrarse en la siguiente URL (http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml) y los datos que necesitamos en los elementos de <cube>. En una estructura de árbol se vería algo así:

<gesmes:Envelope>
    [other child nodes]
    <Cube>
<Cube time="2011-04-12">
    <Cube currency="USD" rate="1.4470"/>
    <Cube currency="JPY" rate="121.87"/>
    …

El gesmes:Envelope es nuestro elemento raiz, al cual podemos acceder usando la propiedad DocumentElement. Luego, podremos acceder a los hijos de este nodo usando la propiedad de tipo colección ChildNodes. En nuestro ejemplo, queremos los nodos hijos que estan tres niveles por debajo del elemento o documento raiz. Podemos hacer eso usando el siguiente codigo, el cual, esencialmente hace lo mismo que el codigo base de XmlReader en el capitulo anterior:

using System;
using System.Text;
using System.Xml;

namespace ParsingXml
{
    class Program
    {
static void Main(string[] args)
{
    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.Load("http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml");
    foreach(XmlNode xmlNode in xmlDoc.DocumentElement.ChildNodes[2].ChildNodes[0].ChildNodes)
Console.WriteLine(xmlNode.Attributes["currency"].Value + ": " + xmlNode.Attributes["rate"].Value);
    Console.ReadKey();
}
    }
}

As you can see, we access the Cube nodes by going down the ChildNodes hierarchy. From the DocumentElement (the root element), we ask for the third child node (zero-index based), then we ask for the first child node of that, and then we ask for the entire collection of child nodes. Obviously this is only possible because we know the structure of the XML document, and it's definitely not very flexible, pretty or easy to change later on. However, the way you navigate an XML document very much depends on the XML source and the data you need. For this example, the above will work just fine and even with a very limited amount of code, but for other purposes, you may want to use a bit more code to increase the readability.

Once we have a node with a currency rate, we access the two properties we're interested in and then output them to the console, just like the example in the previous chapter.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!