Atenção: esse artigo tem uma palestra complementar. Clique e assista!

Atenção: esse artigo tem um vídeo complementar. Clique e assista!

De que se trata o artigo

O artigo dá sequência ao uso dos arquivos XML dentro do framework .NET e a linguagem C#. Desta vez, será mostrado como manipular estes arquivos usando as classes do ADO.NET que é a camada destinada ao trabalho dos dados contidos em bancos de dados, muito embora, não fique restrita apenas a bancos de dados relacionais.


Para que serve

O uso de ADO.NET facilita bastante o acesso aos dados armazenados em arquivos XML que é feito usando as classes que permitem trabalhar com os dados da mesma forma que tabelas armazenadas em bancos de dados. Se a aplicação a ser desenvolvida não usar arquivos XML muito complexos com vários níveis, a escolha do ADO.NET pode facilitar bastante o trabalho.


Em que situação o tema é útil

No desenvolvimento de aplicações que manipulem dados que precisem ser gravados em arquivos XML quer seja para armazenamento de configurações, intercâmbio de dados entre aplicativos etc. Na leitura e geração de arquivos XML sem que seja necessário conhecer DOM (um modelo mais avançado para manipular XML) ou lançar mão das classes contidas em System.Xml.

ADO.NET e Arquivos XML

O framework .NET oferece uma vasta quantidade de classes e métodos para acesso aos dados armazenados em arquivos XML que são cada vez mais utilizados pelos programas especialmente pelo fato de permitir estruturar os dados que são armazenados. Porém muitos dos recursos para o trabalho com os arquivos são complexos e extremamente detalhados exigindo que se tenha um vasto conhecimento da formação dos arquivos XML e o número extenso de classes dificulta mais ainda o trabalho. Por causa do largo uso destes arquivos aos poucos os ambientes de programação como o framework .NET foram criando recursos para facilitar o acesso, leitura e gravação dos conteúdos para o formato XML. Um dos primeiros recursos do framework foi uma biblioteca para facilitar o trabalho de manipulação de bancos de dados que é chamada de ADO.NET. Sendo que esta é uma evolução da biblioteca ADO existente anteriormente no Visual Basic. A característica mais interessante acrescentada nesta biblioteca – além do suporte a vários tipos de bancos de dados – foi o acréscimo de métodos e classes capazes de carregar arquivos a partir dos arquivos XML e gravar neste formato. Uma vez carregado na memória através de um simples método, o conteúdo dos arquivos pode ser modificado usando-se o modo de trabalho desconectado do ADO.NET e ser gravado facilmente com um ou dois passos. Não é um recurso que poderá ser usado em todos os tipos de projeto porque depende da complexidade do arquivo XML a ser manipulado envolvendo seus tipos de dados, profundidade de nós etc. Para por em prática tudo o que será tratado no artigo, um projeto de exemplo fará a exportação de dados lidos do banco Northwind e também irá ler dados de arquivos salvos no formato XML.

Se existe uma tecnologia recente que rapidamente começou a ser adotada dentro do processamento de dados foi a linguagem de marcação XML. Surgida em meados dos anos 1990 é utilizada em quase todos os tipos de aplicação principalmente para a persistência e intercâmbio de dados dos programas. O aspecto mais importante da linguagem é a forma estruturada e hierárquica que os dados são gravados nos arquivos. Com um editor de texto simples como o bloco de notas do Windows e um mínimo de conhecimento de estrutura de dados é possível com pouco tempo entender a estrutura do arquivo e saber quais os dados armazenados e qual a sua estrutura e hierarquia. Veja um arquivo de teste sendo exibido dentro do bloco de notas na Figura 1.

Figura 1. Exemplo de arquivo XML lido no bloco de notas

No arquivo pode-se perceber rapidamente que se trata de um registro de dados de um fictício funcionário de uma empresa. Além de alguns dados do mesmo, armazena diversos registros com dados de seus dependentes. Note que o arquivo permite vários tipos de dados como texto, números inteiros, decimais e datas. É possível também preparar o arquivo para aceitar caracteres especiais vinculados com determinados idiomas como a acentuação do idioma português. Tudo isso é identificado rapidamente apenas olhando-se para o arquivo. Mas, justamente por causa desta facilidade de se entender a estrutura do arquivo é que é tão complicado manipular via programação estes arquivos. Considere por exemplo a hierarquia dos nós de dependentes. Normalmente são usadas as classes de System.Xml para ler e gravar os dados dos arquivos XML. O que ainda assim é complicado porque este arquivo possui diversos níveis nos nós dos dados. Considere ainda se existir a necessidade de se editar estes dados e em seguida, gravar novamente o seu conteúdo.

ADO.NET

Este componente do framework .NET (encontrado em System.Data) disponibiliza uma série de classes que fazem o trabalho de acesso e manipulação aos dados de formas bem distintas. O acesso e edição dos dados estão bem separados permitindo e facilitando principalmente o método de trabalho “desconectado”.

Neste modelo a conexão com a fonte de dados, que pode ser um servidor SQL, arquivos do Access ou qualquer outra fonte de dados suportada é realizada para recuperar os arquivos e enviar as atualizações. Uma vez carregados os dados, estes são manipulados localmente, sem a necessidade de manter a conexão aberta, sendo esta, requisitada somente quando houver necessidade de nova consulta ou de se enviar os dados de volta para a sua fonte. Os principais componentes para o trabalho com os dados de forma hierárquica e que serão vistos neste artigo são as classes DataTable e DataSet.

O número de componentes de ADO.NET é vasto. Graças a arquitetura aberta do framework (arquitetura aberta não é o mesmo que código fonte aberto) onde as especificações de cada componente é bem documentada, foi possível que os desenvolvedores criassem classes para manipulação de outros bancos de dados diferente dos que são suportados nativamente pelo framework. Este artigo não vai se aprofundar em ADO.NET mas, apenas descrever como este pode ser usado para se manipular os arquivos XML.

A classe DataTable

Consiste de um conjunto de colunas – ligadas às colunas de uma tabela do banco de dados – e linhas representando cada uma, um registro. As colunas são definidas pela classe DataColumn sendo que suas propriedades armazenam características tais como:

• Tipo do dado a ser armazenado: texto, números inteiros e decimais, data etc.;

• Restrições: valor máximo e mínimo, duplicações, bloqueio de valores nulos;

• Expressões: usadas para que o conteúdo de dados seja definido a partir do conteúdo de uma ou mais colunas;

• A coluna de origem na tabela do banco de dados.

Também é possível classificar os registros dentro de um objeto deste tipo e realizar relacionamentos com outros objetos do mesmo tipo. Dentre os métodos que a classe oferece, os que nos interessam para a manipulação dos arquivos XML são dois: WriteXml e ReadXml.

O primeiro, como é possível perceber logo no nome, é responsável pela gravação dos dados que estão contidos na tabela para o arquivo XML. Este método possui muitas sobrecargas as quais permitem escrever os dados no formato XML em um arquivo localizado localmente ou na rede, usando uma instância da classe XmlWriter que é responsável por gerar um documento XML na memória, no disco, etc., ou ainda, usando uma stream para enviar dados pela rede ou mesmo pela Internet. Para o trabalho deste artigo vamos estudar duas sobrecargas sendo que a primeira escreve em um arquivo recebendo como parâmetro apenas o nome deste:

DataTable.WriteXml(<nome do arquivo>); 

Desta forma somente os dados são enviados com as tags sendo geradas a partir do nome das colunas da tabela de origem. A estrutura do arquivo criada é a mínima necessária apenas para possibilitar a sua interpretação pelos programas que fazem a leitura deste tipo de arquivo.

Nota: Como toda operação com arquivos é necessário que o usuário que esteja conectado com o Windows e executando o programa possua as devidas permissões para ler e para gravar os arquivos no disco local ou nas unidades de rede, caso contrário, o programa irá causar uma exceção relacionada com a falta de permissão.

Outra variação importante do método permite gravar também a estrutura dos dados armazenados, contendo informação sobre o tipo de dados entre outras coisas. Esta estrutura é denominada nos arquivos XML de schema e veremos um pouco deste assunto mais à frente. O envio da estrutura é importante, pois existem casos em que se esta informação não for enviada com os dados do arquivo, ao se realizar a leitura em outro programa, os dados podem ser recuperados incorretamente, como é o caso de arquivos gerados em versões de idiomas diferentes do sistema operacional.

...

Quer ler esse conteúdo completo? Tenha acesso completo