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.
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: |
|
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!
Estou me batendo para fazer a parte de importação de NF-e, preciso fazer a comparação do SCHEMA, etc.
ResponderExcluirÓtimo post, me ajudou bastante
ResponderExcluirvaleu djowww
ResponderExcluirvaleu!!!
ResponderExcluir