quinta-feira, 11 de outubro de 2012

Genexus - Leitura de XML

A cerca de um mês visualizamos a partir de um post, a possibilidade de realizarmos um controle/histórico de dados da nossa aplicação. Para isto, foram utilizados objetos SDT, Data Provider, além de regras de transações. Como resultado, teremos o registro das alterações, exclusões e inserções de dados através de  de um XML.

A partir deste XML, podemos incrementar este histórico criado, e por que não, realizarmos um controle semelhante ao que o Genexus utiliza para os históricos dos objetos internos. Para quem não se recorda, quando realizamos alterações em qualquer objeto Genexus, este guarda um histórico da posição anterior a alteração, vide figura abaixo. A partir disso, podemos comparar duas posições e visualizar através de tracejados em verde, o que de fato foi alterado.

Genexus XML

No próximo post, iremos aprender como realizar a mesma comparação de históricos a partir daquele nosso XML gravado. Porém antes de tudo, é importante conhecermos um pouco sobre o XML e como realizar a sua leitura.

Então, a XML - eXtensible Markup Language ou Linguagem de Marcação Extensiva - assim como o nome diz, é uma linguagem de marcação, bem como a HTML. A diferença é que a HTML foi projetada para exibir dados, já a XML foi projetada para descrever dados. Enquanto a HTML possui tags pré-definidas (<img />, <br>), na XML é o usuário que define as próprias tags e a própria estrutura do seu documento. 

Esta linguagem não faz nada por si só, pode ser um pouco difícil de entender, mas ela não foi projetada para fazer algo, e sim para estruturar, armazenar e enviar informações. Acredito que atualmente seja a linguagem mais utilizada para a transmissão de dados, um bom exemplo é o próprio governo que a utiliza para as famosas NFe e CTe.

Basicamente um XML contém elementos e atributos, elementos descrevem dados enquanto atributos são como as propriedades dos elementos. Não existe uma regra que indique quando você deve usar um ou outro, veja o exemplo abaixo:
Genexus XML
Exemplo de XML

Utilização de elemento para definição de sexo da pessoa:
<pessoa>
    <sexo>feminino</sexo>
    <nome>Ana</nome>
</pessoa>

Utilização de um atributo para definição de sexo da pessoa:
<pessoa sexo="feminino">
    <nome>Ana</nome>
</pessoa>

Lendo XML através do Genexus

Bom agora vamos colocar estes conceitos para serem utilizados a partir do nosso mestre Genexus. Hoje iremos aprender como desenvolvemos a leitura de um determinado XML, para isto iremos utilizar o tipo de variável XMLReader. O XML a ser trabalhado será:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<MUSICAS xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <MUSICA codigo="001" estilo="rock">
        <NOME>Maluco Beleza</NOME>
        <ARTISTA>Raul Seixas</ARTISTA>
    </MUSICA>
    <MUSICA codigo="002" estilo="samba">
        <NOME>Moleque Atrevido</NOME>
        <ARTISTA>Jorge Aragao</ARTISTA>
    </MUSICA>
    <MUSICA codigo="003" estilo="mpb">
        <NOME>Roda Viva</NOME>
        <ARTISTA>Chico Buarque</ARTISTA>
    </MUSICA>
</MUSICAS>
Esse XML acima foi inserido dentro de um arquivo .txt, e logo após, este arquivo foi renomeado para .xml. Agora, programando no Genexus, iremos abrir este arquivo, realizar a leitura de Tag por Tag, verificando se é uma Tag de abertura, para após, capturar os seus atributos (nome e valor) e as definições de cada elemento (nome e valor). Logo, dentro do evento Start digitaremos o seguinte:
//=====Abre o documento que contém o XML=====
&XMLReader.Open('C:\Temp\file.xml')
 
//=====Realizar a seguinte rotina enquanto não atingir o fim=====
do while &XMLReader.EOF <> true
  
 //=====Ler a próxima Tag=====
 &XMLReader.Read()
  
 //=====Tipo da Tag 1:Elemento 2:EndTag 4:Text 8:Comment=====
 &ElementType = &XMLReader.NodeType
  
 //=====Se a Tag for um elemento=====
 if &ElementType = 1
   
  //=====Captura o Nome do Elemento=====
  &ElementName = &XMLReader.Name
   
  //=====Captura Qtd de Atributos do Elemento=====
  &ContadorAtributos = &XMLReader.AttributeCount
   
  //=====Realizar rotina enquanto houver atributos não lidos=====
  for &i = 1 to &ContadorAtributos
    
   //=====Nome do Atributo=====
   &AttributeName = &XMLReader.GetAttributeName(&i)
    
   //=====Valor do Atributo=====
   &AttributeValue = &XMLReader.GetAttributeByIndex(&i)
  endfor
   
  //=====Captura o Valor do Elemento=====
  &ElementValue = &XMLReader.Value
 endif
enddo
 
//=====Fecha a leitura do XML=====
&XMLReader.Close()
Bom pessoal, este foi exemplo bem simples de uma leitura de um XML, pretendo retomar este assunto posteriormente e analisar um caso mais avançado, como um exemplo de nota fiscal eletrônica. Agradeço a leitura e bons negócios!

4 comentários: