Caro(a) Leitor(a), hoje eu vou mostrar como gerar XML de forma simples e ao mesmo tempo diferente. O que acontece hoje é que todo mundo pega o seu DataSet ou DataTable e transforma em um XML.

O problema é que, se você tem alguma demanda de cliente e esse cliente possui o seu próprio layout, a geração do XML através dos objetos falados anteriormente fica inviável porque as tags são diferentes. 

Existem vários artigos escritos no site www.ecode10.com falando sobre essa geração chamada tipada. Veja os links abaixo:

Neste artigo eu vou mostrar como gerar as suas próprias tags principais e filhas de acordo com o layout de qualquer cliente. O mais interessante é que esse tipo de layout pode ser mudado por você sem muito esforço e serve para qualquer cliente que precisar.

Muitos clientes hoje em dia usam TXT para transportar arquivo, pode ser uma boa, mas não existe muito padrão ou layout. Se for um XML esse padrão fica mais fácil, simples de fazer e ler por qualquer plataforma ou linguagem.

        A primeira coisa é saber qual o layout do cliente ou o layout que precisa gerar o XML. O layout que preciso gerar é mais ou menos assim:

<?xml version="1.0" encoding="UTF-8" ?>
<Documentos>
                        <Data>2011-05-20</Data>
                        <chave>07000270270120254000314</chave>
                        <Tipo>TIPO </Tipo>
                        <Atributos>
                                   <Nome>Nome do cliente</Nome>
                                   <Endereco>Endereço do cliente</Endereco>
                                   <Email>email do cliente</Email>
                        </Atributos>
                        <Compras>
                                   <id>1</id>
                                   <Produto>TV</Produto>
                                   <Valor>3000.00</Valor>
                                   <PathProduto>\Temp\Imagem \0000000001F.PNG</PathProduto>
     <DataCompra>01/01/2012</DataCompra>
                        </Compras>
            </Documentos>

O XML que precisa ser gerado é simples, o problema maior é a geração das tags, de acordo com o cliente. 

Para resolver esse problema, acabei gerando um serviço responsável por pegar os dados no banco de dados e após a leitura dos dados o XML é gerado. Para gerar o XML, passei alguns parâmetros, mas o principal é o DataTable com os dados preenchidos.

Como o sistema possui várias regras, quero focar aqui apenas na geração. 

O primeiro passo foi criar uma classe pública chamada GerarXML (DataRow dtRow) passando como parâmetro a linha do DataTable. A minha regra é que cada linha eu preciso gerar um XML.

A regra básica é gerar a declaração do XML, depois os elementos, depois os filhos vinculados aos elementos. Para adicionar o valor do filho, basta usar o comando AppendChild. A declaração do XML é feito na segunda linha depois de declara o XMLDocument com o comando CreateXMLDeclaration.

Vamos ao código.

public void GerarXML(DataRow dtRow)
{
xmldoc = new XmlDocument();
       xmlnode = xmldoc.CreateXmlDeclaration("1.0", "UTF-8", null);
       xmldoc.AppendChild(xmlnode);

       //tag Documentos <Documentos>
       xmlnode = xmldoc.CreateElement("","Documentos","");

       string _ano = dtRow["SesData"].ToString().Substring(0, 4);
       string _mes = dtRow["SesData"].ToString().Substring(4, 2);
       string _dia = dtRow["SesData"].ToString().Substring(6, 2);

       //Elemento Data
       XmlNode xmlNodeData = xmldoc.CreateElement("Documentos", "Data",null);
       xmlNodeData.InnerText = _ano + "-" + _mes + "-" + _dia;
       xmlnode.AppendChild(xmlNodeData);

       //Elemento Chave
       XmlNode xmlNodeChave = xmldoc.CreateElement("Documentos", "Chave", null);
       xmlNodeChave.InnerText = dtRow["chave"].ToString();
xmlnode.AppendChild(xmlNodeChave);


       //Elemento Tipo
       XmlNode xmlNodeTipo = xmldoc.CreateElement("Documentos", "Tipo", null);
       xmlNodeTipo.InnerText = "TIPO OPERAÇÃO";
       xmlnode.AppendChild(xmlNodeTipo);

       //adiciona no xml
       xmldoc.AppendChild(xmlnode);



       //Tag Atributos <Atributos>
       xmlnode = xmldoc.CreateElement("","Atributos","");

       //Elemento 
       XmlNode xmlNodeComp = xmldoc.CreateElement("Atributos", "Nome", null);
       xmlNodeComp.InnerText = dtRow["nome"].ToString();
       xmlnode.AppendChild(xmlNodeComp);

       //Elemento 
       XmlNode xmlNodeBanco = xmldoc.CreateElement("Atributos", "Endereco", null);
       xmlNodeBanco.InnerText = dtRow["endereco"].ToString();
       xmlnode.AppendChild(xmlNodeBanco);

       //Elemento 
       XmlNode xmlNodeAgencia = xmldoc.CreateElement("Atributos", "Email", null);
      xmlNodeAgencia.InnerText = dtRow["email"].ToString();
      xmlnode.AppendChild(xmlNodeAgencia);

      //adiciona no xml como filho
      xmldoc.ChildNodes.Item(1).AppendChild(xmlnode);


      //###### Tag Compras
      xmlnode = xmldoc.CreateElement("","Compras","");
      for (int i = 0; i < 2; i++)
      {
      //Elemento 
              XmlNode xmlNoteLado= xmldoc.CreateElement("Compras","Id",null);
              xmlNoteLado.InnerText = dtRow["Id"].ToString();
              xmlnode.AppendChild(xmlNoteLado);

              //Elemento 
              XmlNode xmlNotePagina = xmldoc.CreateElement("Compras", "Produto", null);
              xmlNotePagina.InnerText = dtRow["NomeProduto"].ToString();
              xmlnode.AppendChild(xmlNotePagina);

              //Elemento 
              XmlNode xmlNoteExtensao = xmldoc.CreateElement("Compras", "Valor", null);
              xmlNoteExtensao.InnerText = dtRow["Valor"].ToString();
              xmlnode.AppendChild(xmlNoteExtensao);

              //Elemento 
              XmlNode xmlNotePath = xmldoc.CreateElement("Compras", "PathProduto", null);

              xmlNotePath.InnerText = dtRow["PathProduto"].ToString();
              xmlnode.AppendChild(xmlNotePath);

              //Elemento
              XmlNode xmlNoteExtensao = xmldoc.CreateElement("Compras", "DataCompra", null);
              xmlNoteExtensao.InnerText = dtRow["DataCompra"].ToString();
              xmlnode.AppendChild(xmlNoteExtensao);

            }

            xmldoc.ChildNodes.Item(1).AppendChild(xmlnode);


            xmldoc.Save(@”C:\Temp\ + xmlNodeChave.InnerText.ToString() + dtRow["SesData"].ToString() + ".XML");
}

O código informado acima mostra perfeitamente como funciona a geração das tags em XML. É importante que os dados sejam conferidos para não gerar valor errado. Ao criar um elemento, depois de adicionar o InnerText, a tag é fechada automaticamente.

Dessa forma, o resultado fica assim: 
<Documentos>
<Nome>Mauricio Junior</Nome>
</Documentos>

Não posso deixar de falar que um XMLNode é adicionado a o XmlNode principal e depois adicionado ao XMLDoc. O XMLDoc é aquele que contém todo o conteúdo armazenado.

Durante o processo de debug que estiver fazendo, se você parar o mouse em cima do XMLDoc ele vai te mostrar todo o conteúdo adicionado.

Depois de gerar todo XML, basta salvar em algum local de servidor ou máquina local. Veja o código:

xmldoc.Save(@”C:\Temp\ + xmlNodeChave.InnerText.ToString() + dtRow["SesData"].ToString() + ".XML");

Note que o nome do arquivo é de acordo com a chave e a data da sessão. A escolha do do nome foi uma escolha minha, você pode fazer como necessitar. 

        Bom, espero que tenha gostado e aprendido com mais um artigo. Qualquer dúvida pode entrar em contato pelo site.