TOC

This article has been localized into Portuguese by the community.

XML:

Lendo XML com a classe XmlReader

Existem principalmente dois métodos para ler XML com C#: A classe XmlDocument e a classe XmlReader. XmlDocument lê todo o conteúdo XML na memória e, em seguida, permite que você navegue para frente e para trás, conforme desejar, ou até mesmo consulta o documento usando a tecnologia XPath.

O XmlReader é uma alternativa mais rápida e menos consumidora de memória. Ele permite que você percorra o conteúdo XML, um elemento por vez, permitindo que você observe o valor e, em seguida, passe para o próximo elemento. Ao fazer isso, obviamente, consome muito pouca memória, porque ela só mantém o elemento atual e, como você precisa verificar manualmente os valores, só obtém os elementos relevantes, tornando-os muito rápidos. Neste capítulo, vamos nos concentrar na classe XmlReader e depois passar para a classe XmlDocument no próximo capítulo.

Vamos tentar um pequeno exemplo, onde lemos um documento XML contendo taxas de câmbio. Felizmente para nós, o Banco Central Europeu tem um que podemos usar. Poderíamos baixá-lo e lê-lo no disco rígido, mas, na verdade, as classes XmlReader e XmlDocument podem ler XML de uma URL remota tão bem quanto de um arquivo local. Você pode ver o XML aqui ( http://www.ecb.int/stats/eurofxref/eurofxref-daily .xml ) e aqui vem um código e depois uma explicação:

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();
        }
    }
}

Começamos criando a instância XmlReader, usando o método estático Create(). Tem várias sobrecargas, mas a mais simples delas apenas pega uma URL apontando para o arquivo. Em um loop while, chamamos o método Read() na instância XmlReader. Ele avança o leitor para o próximo elemento e retorna true, desde que haja mais para ler. Dentro do loop, agora podemos usar uma das muitas propriedades e métodos no XmlReader para acessar os dados do elemento atual.

Em nosso caso, verificamos o NodeType para ver se temos um Element (a parte da tag) e se o nome é "Cube". Como você pode ver no documento XML que usamos, cada taxa de moeda está dentro de um elemento chamado Cubo, então é claro que é isso que estamos procurando - o restante é ignorado. Uma vez que temos um elemento Cube, fazemos uma verificação formal para ver se ele tem atributos (o que deve) e, em seguida, usamos o método GetAttribute() para ler os dois valores de atributo "currency" e "rate". Nós os imprimimos no Console e depois passamos para o próximo elemento. O resultado deve ser uma lista completa de moedas e sua taxa de câmbio atual.

Como você pode ver, isso é bem simples de se fazer, mas principalmente porque precisamos apenas dos dados na mesma ordem em que são lidos, sem fazer nada de especial. No próximo capítulo, faremos a mesma coisa, mas usando a classe XmlDocument, para que você possa ver a diferença.

Nota: Você deve estar ciente de que há muitas maneiras em que o código acima pode falhar e lançar uma exceção, que você deve, naturalmente, manipular. Veja o capítulo sobre exceções para mais informações.


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!