SQL Magazine edição 51
Esse artigo faz parte da revista SQL Magazine edição 51. Clique aqui para ler todos os artigos desta edição

Extraindo documentos XML de bancos relacionais

A tecnologia XML está cada vez mais presente na vida dos desenvolvedores. Documentos XML podem ser usados de diversas formas, como para definir arquivos de configuração, separar dados da formatação e definir protocolos de comunicação.

Documentos XML também são comumente usados como formato de dados auxiliar para aplicações que necessitam trocar informação entre si (web services, por exemplo). Tendo em vista esta última aplicação e sabendo que informações costumam ser armazenadas em bases de dados relacionais, surge a necessidade de extrair informações de uma base de dados em formato XML. Existem diversas formas de realizar esta extração, que vão desde o uso de recursos do próprio SGBD, até o desenvolvimento de soluções ad-hoc, passando pelo uso de middlewares de conversão de dados.

De modo geral, os recursos do SGBD para extração de dados em XML são limitados. Os documentos XML extraídos possuem uma estrutura muito rígida, e alterações dessa estrutura só podem ser realizadas através de mecanismos por demais complexos. Soluções ad-hoc ou desenvolvidas com o auxílio de um middleware costumam ser opções mais flexíveis, além de serem genéricas, não ficando restritas a bancos de dados de um fabricante específico.

Este artigo está dividido em duas partes. Primeiramente investigaremos uma série de estratégias de consulta SQL, que podem ser usadas para facilitar a extração de dados realizada de modo ad-hoc. Na segunda parte, será apresentado o middleware de conversão SAXES, que permite que projetos de conversão de dados sejam criados utilizando uma interface visual de mapeamento.

Aplicação de exemplo

Para a nossa aplicação de exemplo, vamos supor que ocorreu uma fusão entre duas redes de supermercados (Rede A e Rede B). Fusões costumam gerar uma série de complicações, como a adequação dos processos internos para a nova realidade, o uso de uma política comum para com clientes, fornecedores, etc. Como não poderia deixar de ser, os sistemas computacionais também precisam passar por uma integração. Para o caso em questão, decidiu-se manter a base de dados com as movimentações financeiras da rede A e realizar a migração de dados da Rede B para a Rede A. Após a migração, por um período chamado de transição, a rede B continuará usando o seu próprio sistema, mas deverá enviar suas movimentações financeiras para a Rede A ao final de cada expediente.

O modelo de dados usado pela Rede B está representado na Figura 1. Trata-se de uma versão simplificada do que seria um modelo de dados para o domínio de notas fiscais. O uso de um modelo simples facilita a demonstração dos conceitos que serão abordados neste artigo.

Modelo relacional para o domínio de notas fiscais
Figura 1. Modelo relacional para o domínio de notas fiscais

Estrutura de uma DTD

Ficou acordado que esta sincronização diária será realizada através de um processo de intercâmbio de documentos XML. As informações sobre notas fiscais deverão ser remetidas via XML usando o esquema de dados descrito na Listagem 1. Esta listagem traz um esquema XML em formato DTD (Veja o quadro “Estrutura de uma DTD” para saber algumas informações básicas a respeito do esquema XML que compõe o exemplo). A Listagem 2 traz um documento XML que é válido de acordo com esta DTD.

No formato DTD, os elementos que podem aparecer em um documento XML devem ser declarados. Esta declaração é feita através da palavra reservada Após o nome do elemento, são especificados os elementos que podem aparecer como filhos do elemento declarado.

Para cada elemento filho, deve ser indicada a freqüência com que ele pode ocorrer dentro do elemento pai. A freqüência pode ser declarada através dos caracteres “?”,”*” e “+”. Estes caracteres indicam, respectivamente, uma freqüência opcional (0-1), freqüência múltipla, mas opcional (0-n) e uma freqüência múltipla e obrigatória (1-n). Se nenhum desses caracteres for usado, assume-se que a freqüência é simples e obrigatória (1-1).

Elementos que possuem informação textual são declarados através da palavra reservada #PCDATA.

Listagem 1. Esquema DTD que deve ser usado para a geração dos documentos XML

            <!ELEMENT notas (nota+)>
            <!ELEMENT nota (nomeCliente, emissaoNota, item+)>
            <!ELEMENT item (descricao, quantidade, valorItem)>
            <!ELEMENT nomeCliente (#PCDATA)>
            <!ELEMENT emissaoNota (#PCDATA)>
            <!ELEMENT descricao (#PCDATA)>
            <!ELEMENT quantidade (#PCDATA)>
            <!ELEMENT valorItem (#PCDATA)>
         ... 

Quer ler esse conteúdo completo? Tenha acesso completo