Uma das coisas mais comuns em programação é a necessiade de lermos um XML. Existem diversas formas de se fazer isso no .Net, mas acredito que uma das menos difundidas é a através de geração de Datasets pelo XSD.EXE.
O xsd.exe é um pequeno utilitário que vem junto com o framework .Net. Com ele você pode gerar esquemas XSD a partir de um XML e gerar classes C# (ou VB.Net) a partir de um XSD.
Para exemplificar a criação de um Dataset usarei um arquivo GPX, que é um arquivo XML gerado por GPS da marca Garmin com o track de uma rota que você tenha feito. Esse arquivo é um XML comum, apenas possui uma extensão diferente. (ao final você terá um pacote para baixar com o código fonte completo e um arquivo gpx de exemplo)
Para facilitar o entendimento, veja abaixo um trecho de um arquivo GPX:
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<gpx xmlns="http://www.topografix.com/GPX/1/1" creator="" version="1.1"
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">
<trk>
<name>ACTIVE LOG084916</name>
<trkseg>
<trkpt lat="-26.881269" lon="-49.073844">
<ele>29.325</ele>
<time>2008-08-10T11:49:15Z</time>
</trkpt>
<trkpt lat="-26.881268" lon="-49.073835">
<ele>29.325</ele>
<time>2008-08-10T11:49:16Z</time>
</trkpt>
Perceba que abaixo do elemento root (<gpx>) ele possui mais 3 grupos de elementos: <trk>, <trkseg> e <trkpt>, sendo que esse último contém os dados de um ponto registrado. O GPS grava um ponto desses a cada x segundos ou x metros, dependendo da configuração. A definição das quebras em trkseg e trk não é importante para o nosso entendimento no momento.
Gerando o arquivo de definição - XSD
Na maioria das vezes não temos um arquivo XSD pronto. Os arquivos GPX possui uma definição que pode ser baixada em http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd mas não iremos utilizá-la nesse exemplo.
É importante salientar que a utilização de XSDs para ler um XML só será válida para arquivos que respeitem exatamente as definições do XSD.
Para gerar o XSD abriremos um prompt de comando. Como o arquivo tem extensão gpx, vamos criar uma cópia com a extensão XML:
Agora podemos criar o arquivo XSD com o comando xsd.exe gpx.xml:
E por último, iremos gerar os arquivos c# juntamente com o comando xsd.exe gpx.xsd /dataset . O argumento /dataset indica que queremos criar um dataset:
Pronto! Já temos nosso dataset. Agora podemos usá-lo em nossa aplicação.
Usando um dataset gerado
Crie uma nova aplicação do tipo Console (ou asp.net se preferir). Com o botão direito do mouse sobre o projeto, selecione a opção Add->Existing Item. Na caixa de diálogo que será aberta, selecione o arquivo XSD gerado anteriormente. Atenção, note que você deve selecionar o arquivo XSD e não o .CS. Dessa forma o Visual Studio entenderá que você está importando um Dataset e irá criar os arquivos de suporte necessários.
Veja no exemplo abaixo como ficará sua aplicação após a importação:
Perceba que ele criou os arquivos gpx.xsc e gpx.Designer.cs. Assim você pode manipular seus Dataset como se estivesse usando um Dataset de banco de dados!.
Exemplo de utilização do Dataset gerado:
/*
* Exemplo de leitura de arquivo xml através de XSD
* Data: 11/08/2008
* Criado por Cassio R Eskelsen (eskelsenARROBAgmail.com)
*/
using System;
class Program
{
static void Main(string[] args)
{
NewDataSet ds = new NewDataSet();
ds.ReadXml("gpx.gpx");
foreach (NewDataSet.trkptRow tp in ds.trkpt.Rows)
{
Console.WriteLine("Longitude: " + tp.lon);
Console.WriteLine("Latitude: " + tp.lat);
Console.WriteLine("Elevação: " + tp.ele);
}
}
}
Os nomes das propriedades da classe são gerados de acordo com o XSD. Com um um pouco mais de trabalho você pode personalizar o dataset gerado.
O arquivo abaixo contém uma solution de exemplo que foi criada usando o Visual Studio 2008, no entanto o exemplo acima funciona em versões anteriores do .Net também.