Como Importar arquivos XML para o MySQL
No post de hoje vou demonstrar como importar aquivos XML para o MySQL sem utilizar linguagens como PHP, Java, C#, Python ou etc., vamos usar apenas comandos nativos do MySQL.
É muito difícil encontrar um programador que nunca teve contato com arquivos XMLs, principalmente quem trabalha com NF-e, mas também existem casos de sincronização de produtos, clientes e etc.
Outros posts sobre MySQL que podem interessar:
Curiosidades sobre os tipos de dados do MySQL
Visão geral sobre índices no MySQL
Utilizando a função DATE_SUB() para cálculo de datas no MySQL
Geralmente quando precisamos desse tipo de importação já pensamos logo em uma linguagem para nos auxiliar, eu mesmo já penso logo no PHP que tem muita facilidade para ler arquivos XML.
Mas o MySQL possui uma funcionalidade nativa para executar importação de arquivos XML para uma determinada tabela que informamos no momento da importação, estamos falando do comando LOAD XML INFILE.
1 2 3 4 |
LOAD XML INFILE '/caminho/do/xml' INTO TABLE nome_tabela CHARACTER SET utf8 ROWS IDENTIFIED BY '<tag_delimitadora>'; |
A sintaxe é bem simples, existem vários parâmetros opcionais mas basicamente é só informar:
- Caminho do arquivo XML
- Nome da tabela onde serão importados os dados
- Charset dos caracteres
- Tag que delimita os registros no XML.
Se quisermos evitar digitação é importante que o nome dos campos da tabela sejam iguais aos nomes das TAGs no arquivo XML, caso não sejam podemos setar na própria instrução o nome dos campos, leia mais detalhes na documentação oficial do MySQL.
Importar XML para o MySQL
Nesse exemplo vamos importar dados de clientes fictícios de um arquivo XML para uma tabela com o nome “cliente” no banco de dados “db_blog”:
Estrutura do XML
Observem que para cada tag “<cliente>” e “</cliente>” temos dados de um cliente, então nossa tag que delimita os registros é “<cliente>”:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<cliente> <id>1</id> <nome>William</nome> <email>wllfl@ig.com.br</email> <sexo>Masculino</sexo> <cidade>São Roque</cidade> </cliente> <cliente> <id>2</id> <nome>João</nome> <email>jj@email.com.br</email> <sexo>Masculino</sexo> <cidade>São Paulo</cidade> </cliente> <cliente> <id>3</id> <nome>Maria</nome> <email>maria@email.com.br</email> <sexo>Feminino</sexo> <cidade>Osasco</cidade> </cliente> |
Estrutura da Tabela
Observem que na tabela temos um campo “cpf”, ele será desconsiderado pela importação pois no arquivo XML não existe TAG com esse nome:
1 2 3 4 5 6 7 8 9 |
CREATE TABLE `cliente` ( `id` int(11) NOT NULL, `nome` varchar(100) CHARACTER SET latin1 DEFAULT NULL, `cpf` varchar(10) DEFAULT NULL, `email` varchar(100) CHARACTER SET latin1 DEFAULT NULL, `sexo` varchar(10) CHARACTER SET latin1 DEFAULT NULL, `cidade` varchar(50) CHARACTER SET latin1 DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; |
Executando Importação
Para executar a importação temos que passar o caminho físico do arquivo, nesse exemplo meu arquivo XML está nesse caminho “/home/william/Documentos/Artigo/ImportarXML/cliente.xml”.
1 2 3 4 5 6 |
USE db_blog; LOAD XML INFILE '/home/william/Documentos/Artigo/ImportarXML/cliente.xml' INTO TABLE cliente CHARACTER SET utf8 ROWS IDENTIFIED BY '<cliente>'; |
Observação: Para usuários Linux(Ubuntu) é necessário alterar o arquivo “/etc/apparmor.d/usr.sbin.mysqld”, adicionando 2 linhas que concedem permissão de leitura para o MySQL e posteriormente recarregar as configurações.
1 2 3 4 5 6 7 8 |
/usr/sbin/mysqld { /var/log/mysql/ r, /var/log/mysql/* rw, /var/run/mysqld/mysqld.pid w, /var/run/mysqld/mysqld.sock w, /data/ r, #Adicionar essa linha /data/* rw, #Adicionar essa linha } |
Recarregando as configurações:
1 |
sudo /etc/init.d/apparmor reload |
Resultado Final
Bom pessoal é isso, nesse post demonstrei o básico de como podemos importar arquivos XML para o MySQL usando apenas comando nativos, sem a necessidade usar linguagens intermediárias. É claro que essa funcionalidade não é destinada para o usuário final e sim para nós programadores que sempre temos essa necessidade.
Vale ressaltar que não é só o MySQL que possui essa facilidade, os principais SGBDs do mercado também possuem comando nativos para manipular arquivos XML.
Até a próxima …