Atenção: esse artigo tem dois vídeos complementares.
Clique e assista o primeiro!

Clique e assista o segundo!

De que se trata o artigo

O artigo aprofunda na demonstração de técnicas para a geração de documentos XML a partir de classes que foram definidas no Framework .NET. Estas técnicas envolvem entre outros aspectos a criação de elementos opcionais no documento e a fusão de vários XMLs em um único arquivo.

Para que serve

Conhecendo as ferramentas que serão apresentadas o desenvolvedor agiliza o desenvolvimento de rotinas que envolvam a geração dos documentos XML. Se estiver usando a serialização de classes, os benefícios serão ainda maiores.

Em que situação o tema é útil

Em cenários onde seja importante persistir dados que já estejam carregados na memória através das classes do projeto. Se for necessário personalizar o nome das tags que precisam ser incluídas no documento XML deixando diferente da propriedade que armazena o dado na classe. Se no projeto que você estiver desenvolvendo, for necessário unir vários documentos XML para gerar um único.

XML

Já tratei da geração de arquivos XML em outras oportunidades e retorno ao tema aqui porque existem lacunas a serem preenchidas. No meu trabalho preciso constantemente dar manutenção em códigos que geram este tipo de documento e sempre surgem necessidades que me obrigam a realizar customizações para atender a um ou outro requisito. Documentos XML são complexos, mas, o Framework .NET é altamente integrado com esta tecnologia. Logo, não faz sentido deixar de usar os recursos disponibilizados. Durante o artigo vou demonstrar como preparar as classes do C# que são usadas para a definição da estrutura e comportamento dos dados no projeto para criarem um arquivo XML adequado às necessidades do usuário. Serão considerados alguns problemas que precisam ser resolvidos durante este trabalho, e um dos pontos importantes a ser demonstrado é como fazer para gerar um documento XML a partir de outros. Para demonstrar parte do que foi exposto, foi desenvolvido um projeto usando Windows Forms e módulos que fazem o acesso aos dados e a geração do documento XML. Adicionalmente alguns aspectos dos projetos Windows Forms serão expostos para melhorar o desenvolvimento de projetos deste tipo.

Atualmente muitas aplicações se beneficiam da utilização dos arquivos XML quer seja para troca de dados ou para sua persistência, ou pelo menos, para armazenamento de parâmetros de configuração. Assim, a sua presença é constante em várias plataformas.

A XML que tem uma linguagem de marcação que se assemelha ao HTML inicialmente, permite representar de maneira simples, dados estruturados que podem ser muito complexos. Com sua forma estruturada e hierárquica de organizar os arquivos, é um dos formatos de arquivo mais adotado para o intercâmbio de dados entre aplicações diferentes e, como era de se esperar uma das mais utilizadas em aplicações que tem como plataforma a Internet.

Tanta flexibilidade tem um preço: gerar documentos XML é complicado. O desenvolvedor precisa cuidar de atributos, schemas, elementos opcionais, namespaces, marcações e suas regras de preenchimento. Como se já não fosse o bastante, os projetos modernos são desenvolvidos usando linguagens orientadas a objeto, o que a primeira vista parece não combinar muito bem com documentos XML.

Para evitar ficar escrevendo códigos extensos para gerar os arquivos e acabar perdendo de vista as vantagens das linguagens orientadas a objeto, o Framework .NET disponibiliza diversos recursos para auxiliar na tarefa de geração de documentos XML. Uma capacidade do Framework que mais chama a atenção é a de gerar o XML partindo da estrutura de dados existente nas classes. Mais do que demonstrar o processo de serialização para estes documentos, vamos verificar alguns problemas envolvidos e como resolvê-los.

Arquivos XML

Para prosseguir com os pontos que pretendo colocar, gostaria de revisar alguns pontos. Os arquivos XML, como já citado, são organizados de forma hierárquica. Seu agrupamento de informações se dá através dos chamados nós. São eles que são ordenados. Esses nós também representam os elementos que compõem um arquivo. Os elementos por sua vez possuem atributos que contêm a informação propriamente dita. O conteúdo XML a seguir mostra essa estrutura:

<?xml version="1.0" encoding="utf-16"?>
  <produto xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Codigo="123" xmlns="http://contoso.com/xml">
    <Descricao>Agua mineral</Descricao>
    <Preco>9.98</Preco>
    <Unidade>PC</Unidade>
  </produto>

Nela é fácil identificar que se trata de informações sobre algum produto. Seus elementos devidamente nomeados possibilitam uma “leitura” por nós, humanos.

Criação de XML

A criação do XML usando o Framework .NET pode ser feita de várias maneiras. A seguir demonstro as mais comuns. É possível realizar uma geração manual usando o conjunto de classes contido no namespace System.Xml, como XmlDocument, XmlNode, XmlWriter e XmlWriterSettings passando o conteúdo do documento literalmente. Veja o código do seguinte exemplo:


 XmlDocument xmlDoc = new XmlDocument();
 xmlDoc.LoadXml("<xml><nome>Vladimir Rech</nome></xml>");
 Console.WriteLine(xmlDoc.InnerXml); 

Este código produz o seguinte resultado:

<xml>
    <nome>Vladimir Rech</nome>
  </xml>

Outra forma é usar a linguagem de consultas integradas LINQ. A geração de um documento como este:

<CD>
    <Obra Titulo="Brothers in Arms" Ano="1982">
      <Autor>Dire Stratis</Autor>
      <Estilo>Pop/Rock</Estilo>
    </Obra>
    <Obra Titulo="Yamandu" Ano="2008">
      <Autor>Yamandu Costa</Autor>
      <Estilo>MPB Instrumental</Estilo>
    </Obra>
  </CD>

Ficaria com o seguinte código usando LINQ:


 var MeuXml = new XElement("CD",
   new XElement("Obra",
     new XAttribute("Titulo", "Brothers in Arms"),
     new XAttribute("Ano", "1982"),
     new XElement("Autor", "Dire Stratis"),
     new XElement("Estilo", "Pop/Rock")),
  new XElement("Obra",
     new XAttribute("Titulo", "Yamandu"),
     new XAttribute("Ano", "2008"),
     new XElement("Autor", "Yamandu Costa"),
     new XElement("Estilo", "MPB Instrumental")));
     //Grava o documento no disco
  MeuXml.Save(@"d:\docCD.xml");

Nestes exemplos temos um problema de que o código acaba ficando muito acoplado, com pouca flexibilidade para se adaptar com uma estrutura de dados dinâmica. Acrescente o fato de que nem sempre todos os tipos de dados serão conhecidos durante o projeto.

Nota: Considere situações como aplicações conectadas com bancos de dados. Uma finalidade dos documentos XML é a de permitir a troca dos dados desta aplicação com outra. Neste cenário, é preciso que a geração do documento possa aproveitar para ler esta estrutura e se adaptar.

Problemas a serem resolvidos na geração dos documentos XML

Dentre os vários problemas cito alguns:

· Capacidade de gerar dinamicamente o documento aproveitando a estrutura dos dados existente: Isto significa que a aplicação deve ser capaz de usar os dados carregados na memória independentemente da forma como estejam organizados;

· Permitir que os dados a serem enviados no formato XML se adaptem ao schema definido para o documento;

· Dar flexibilidade para agrupar vários documentos em um único arquivo;

· Preenchimento opcional de elementos do XML: Pode haver casos onde um conteúdo deva ser omitido.

Para estes casos e outros que possam surgir, o Framework .Net dá ao desenvolvedor as ferramentas necessárias para facilitar o trabalho. Eventualmente, existirão aquelas onde o trabalho será maior, mas, muitas situações poderão ser resolvidas com os recursos apresentados neste artigo.

Nota do DevMan

Para os desenvolvedores acostumados com o ADO.NET as classes como DataSet e DataTable são velhas conhecidas. Estas mantêm os dados na memória usando uma estrutura de documentos Xml. Não é por acaso que para converter os dados carregados nestas classes para este tipo de arquivo basta fazer uma chamada para métodos como o WriteXml.

...

Quer ler esse conteúdo completo? Tenha acesso completo