This article has been localized into Portuguese by the community.
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.