Lendo um XML de forma fortemente tipada

by Cássio R Eskelsen 11. agosto 2008 14:15

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:

 

criando_xml

 

Agora podemos criar o arquivo XSD com o comando xsd.exe gpx.xml:

 

criand_xsd

 

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:

 

criando-ds

 

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:

 

dataset

 

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.

Tags: ,

.Net

Comentários

Comentar




  Country flag

biuquote
  • Comentário
  • Pré-visualização
Loading