Manipulando estrutura de dados XML no MySQL

O formato XML está por aí faz um bom tempo. Salvo engano desde 1998. Quem trabalha com aplicações web, certamente, já tropeçou no XML.

O XML (eXtensible Markup Language) é uma estrutura de dados criada com o objetivo de tornar estes dados de fácil leitura por humanos (nós) and por máquinas. “Markup” porque usa marcações (tags) para determinar o início e fim de um dado.

Sua estrutura de dados é, de fato, bastante simples. Totalmente textual, ou seja, lida por olhos humanos. E, é muito usada na troca de dados entre aplicações/serviços de web, entre outros.

Muito tem sido dito que JSON substitui o XML. Minha opinião? Um dia pode ser que sim. Mas, atualmente, há muitas aplicações legadas, atuais, e, novas sendo criadas utilizando-se a estrutura de dados do XML. Sempre achei XML elegante, mas, que consome espaço demais (muito verbosa). E, o fato de ser obrigado a abrir e fechar uma marcação (tag) sempre me aborreceu. Portanto, acredito que ainda veremos muito XML por aí.

Como se define uma estrutura de dados XML:


<tag> Jedi </tag>

<tag>
   Jedi
</tag>

<codigo>001</codigo> <nome>Luke Skywalker</nome>

<codigo> 001 </codigo> 
<nome> Luke Skywalker </nome>

Não há um limite teórico para uma XML. Existem arquivos XML com muitos megabytes (trivial) até gigabytes (raros). Também, não há um limite de marcações (tags) e valores. No entanto, uma vez que se pretende armazenar um XML numa coluna, obviamente, o tamanho do XML deve ser compatível com tamanho máximo desta coluna.

É preciso enfatizar que XML é usado para troca de dados entre processos e/ou aplicações (chamadas de API, por exemplo), armazenamento (configurações, por exemplo), e, para importação e exportação de dados (lista de boletos emitidos, por exemplo). Somente, neste último é concebível pensar em grandes massas de dados e/ou arquivos.

A formatação da estrutura de XML adotada pelo MySQL segue o padrão definido pelo W3C (World Wide Web Consortium) chamado XPATH (XML Path Language) em sua versão 1.0 (1999). Atualmente, o XPATH está na versão 3.1.  Conheça mais sobre o XPATH 1.0.

Que tal balançarmos nossos sabres de luz um pouquinho? Vamos brincar com MySQL e o XML.

Primeiro, vamos criar uma tabela para comportar nosso XML:

MySQL XML mal formatado
MySQL XML mal formatado

 

Aqui, eu preferi utilizar uma coluna TEXT, mas, poderia ter utilizado VARCHAR, ou, qualquer outro tipo de dados que armazene texto de forma adequada e eficiente. Woooopa! Texto? String? Mas, não estamos falando de XML? Sim, como falamos, o XML é uma estrutura de dados TEXTUAL. Então, em última instância é uma “string” bem formatada. Assim sendo, posso armazenar o XML em variáveis, colunas, e, arquivos.

Na figura abaixo, temos a atribuição de uma “string” à uma variável de sessão definida pelo usuário.

MySQL XML Correto
MySQL XML Correto

 

Uma vez que esta “string” está, adequadamente, formatada conforme o XPATH 1.0, vamos, chama-la, a partir desse momento de XML.

Note que as marcações (tags) são id, name e order. Perceba que cada “tag” está contida ou definida entre os sinais de menor e maior. E, o valor atribuído encontra-se entre a abertura e o fechamento da “tag”. Sendo que a “tag” de encerramento tem um “/” antes de seu nome, como visto:

Tag de abertura/inicio Valor atribuído Tag e encerramento/fim
<name> Luke Skywalker </name>

Entre “tags” podermos ter um espaço, vários espaços, nenhum espaço, quebras de linhas, tabulação. Isso, de fato não importa. Formate seu XML de acordo com sua necessidade: facilitar a leitura humana, ou, poupar espaço para otimizar a leitura por máquina.

Vamos criar um XML com formatação incorreta, deixando de fechar uma “tag”:

MySQL XML mal formatado
MySQL XML mal formatado

 

Claramente, o XML acima é inválido, pois, iniciou-se a tag <midichlorian>, atribuiu-se um valor, mas, não foi encerrada adequadamente com o</midichlorian>.  Coisas de Jedi, se fosse Sith teria funcionado? Claro que não!

Vamos lembrar que o XML é um texto, uma “string”. No entanto, note que estamos usando a sessão do MySQL. Aonde, não existe o tipo de dados XML. Também não existem colunas do tipo XML.

Portanto, não há validação de XML para colunas, nem, para variáveis de sessão. É o que chamamos de validação fraca, ou, sem validação alguma.

O MySQL sempre irá acreditar que o desenvolvedor envidará os melhores esforços para entregar o XML formatado corretamente, e, de acordo com padrão implementado.

Contudo, há uma forma menos rudimentar de trabalhar com XML, ao menos, forçando validação em sua tipografia. Isso é conseguido a partir do tipo de dado, exclusivo, para variáveis dentro de rotinas, como procedures, functions, e, events. Vamos ver como isso funciona.

Criamos uma procedure, bastante simples, que irá mostrar o conteúdo de uma “tag”:

E, vamos usá-la:

MySQL: Procedures e XML
MySQL: Procedures e XML

 

No primeiro caso, a nossa XML não tinha a “tag” esperada “midichorians”, e, retornou branco. Depois, submetemos uma XML mal formatada (sem o fechamento da “tag” “midichorians”), e, retornou NULL. Além disso, também recebemos uma mensagem de “warning”: “Incorrect XML value”.

Não é uma “mega” validação, jogando erro em vermelho piscante, emitindo beeps, mas, já é alguma coisa.

Lembre-se: Não existe o tipo de dados XML. Faça sua parte: formate o XML corretamente.

Este artigo continuará!

Deixe um comentário

O seu endereço de e-mail não será publicado.

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.