quinta-feira, 22 de setembro de 2011

Porque XML?

Um dia alguém acordou muito inspirado pensou, que tal resolver uma situação complexa com um mecanismo totalmente flexível, aberto, gratuito para que cada um pensasse na solução de seu próprio problema, e para complementar, utilizando um arquivo em formato texto que qualquer Notepad poderia resolver. Coisas assim, não acontecem com muita freqüência, e assim nasceu o formato XML.


XML se parece muito com HTML, creio que foi a inspiração, e consiste em uma forma de representação baseada em elementos chamados de Tags. É um formato muito simples de compreender, mas estranho para se programar, e se optarmos pela via da leitura das Tags individuais, ai então a coisa pega feio mesmo. Até o exemplo apresentado pela Artech para leitura de arquivos XML é de fato complicado.

Uma alternativa para manipular XML’s é através de SDT’s, que naturalmente podem exportar (ToXml) e importar (FromXml), informações nesse formato. Estaremos nesse Post explorando um pouco essa praia.

1.      Criando o Structured Data Type

A primeira coisa a ser feita é criar um SDT de exemplo, que pode conter informações a respeito de um determinado Cliente.


Lembre-se que um SDT pode ser criado automaticamente através de uma transação previamente criada, apenas pelo processo de arrastá-la para a estrutura vazia.

2.      Alimentando o SDT

Criando uma variável do tipo SDT Cliente, será possível armazenar os valores, correspondentes aos campos definidos na estrutura.  Um evento Start em um webpanel é suficiente para manipular essa variável.

Event Start
      &cliente.Codigo         = 1
      &cliente.Nome           = "João da Silva"
      &cliente.Endereco       = "Rua 1, 2"
      &cliente.Bairro         = "Centro"
      &cliente.Cidade         = "Rio Claro"
EndEvent

Um pouquinho de conhecimento sobre coleções ou Data Provider, e você gera uma lista de clientes a partir desse exemplo simples.  Uma dica simples crie uma variável &clientes do tipo SDT Cliente e marque-a como coleção. Em seguida, para adicionar um elemento na coleção programe.

Event Start
      &cliente = new()
      &cliente.Codigo         = 1
      &cliente.Nome           = "João da Silva"
      &cliente.Endereco       = "Rua 1, 2"
      &cliente.Bairro         = "Centro"
      &cliente.Cidade         = "Rio Claro"
      &clientes.add(&Cliente)

&cliente = new()
      &cliente.Codigo         = 2
      &cliente.Nome           = "Manuel da Silva"
      &cliente.Endereco       = "Rua 2, 1"
      &cliente.Bairro         = "Vila Betinha"
      &cliente.Cidade         = "Rio Claro"
      &clientes.add(&Cliente)
     
EndEvent

Ou seja, para cada novo &cliente é necessário um &cliente = new().


3.      Manipulando o XML

Em seguida, uma pequena operação sobre essa variável SDT exporta a informação armazenada em um formato Texto/XML.


Event Start
      &cliente.Codigo         = 1
      &cliente.Nome           = "João da Silva"
      &cliente.Endereco = "Rua 1, 2"
      &cliente.Bairro         = "Centro"
      &cliente.Cidade         = "Rio Claro"
     
     
      &texto = &cliente.ToXml()
EndEvent

E o resultado pode ser apresentado na interface.

 
Simples não, o Genexus se encarregou de exportar a informação previamente armazenada, no formato XML.

4.      O que fazer com esse tal XML?

Você poderia estar se perguntando por que dessa confusão toda, talvez não esteja tão inspirado quanto os inventores dessa coisa, talvez precise de férias, sei lá, mas uma resposta boa e simples seria, o que aconteceria se você passasse &texto como parâmetro para outro objeto.  Uma boa resposta seria, estaria passando todas as informações referentes a um determinado cliente.  Mas lembre-se que essa se encontra em um formato texto.

Para testar crie um segundo webpanel, e declare a regra Parm abaixo, com a variável &clienterecebido definida como Varchar(300), que receberia o valor da variavel &texto passada por parâmetro.
parm(&clienterecebido);

Esse texto recebido poderia então ser convertido em uma variável SDT novamente, usando um método simples.
Event Start
      &cliente.FromXml(&clienterecebido)
EndEvent

E o resultado seria a reconstrução da variável original &cliente com todos os valores previamente carregados.

Conclusão

Então podemos concluir o seguinte, XML é excelente para transferir informações de um lado para outro, de sistema para outro sistema, e foi por essa razão que o formato ‘pegou’. Hoje já surgiram outros mais leves como o JSON, também manipulável pelo Genexus, mas ambos consistem em  mecanismos eficientes para fazer sistemas ou objetos conversarem.
Mas não para por ai, teste, por exemplo, armazenar o XML em uma variável de sessão, talvez você reconsidere a forma que anda armazenando os contextos de seu sistema.
Tão útil quanto um cabo para fazer uma 'chupeta' de uma bateria a outra, lembra da última vez quando ficou parado em um local escuro, com a bateria arriada, com a namorada impaciente no banco do carona, talvez até meio arrependidada de ter saido com 'o vacilão', e alguém apareceu com um cabinho milagroso. Então, nunca se sabe se você não terá que fazer uma 'chupeta' nos seus sistemas.