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:
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.
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”:
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:
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á!