Como importar dados de um arquivo XML

Há um tempo atrás escrevi um artigo falando sobre arquivos XML e a importância que eles têm pelo fato de serem uma ótima opção para armazenamento de dados e também por possibilitarem a migração de informações de um sistema para outro independente da linguagem ou banco.

Esse artigo (Confira Aqui) mostrava como buscar dados em um banco de dados MySQL e depois exportá-los para um arquivo XML.

Pois no post de hoje iremos fazer o processo inverso, ou seja, ler um arquivo XML já existente e trabalhar com as informações dele dentro do php, seja salvando em uma base de dados ou mesmo os imprimindo na tela.

Para isso utilizaremos um método nativo do PHP, que é o simplexml_load_file (Leia mais aqui) que funciona como conversor de arquivos XML em objetos php.

Bom, para iniciar, vamos supor um arquivo lista_contatos.xml com a estrutura à seguir:

<?xml version='1.0' encoding='UTF-8'?> 
<Newsletter> 
	<Contato>
		<idcontato>1</idcontato>
		<nome>Ana</nome>
		<email>ana@dominio.com</email> 
	</Contato>
        <Contato>
		<idcontato>2</idcontato>
		<nome>Maria</nome>
		<email>maria@dominio.com</email> 
	</Contato>
        <Contato>
		<idcontato>3</idcontato>
		<nome>Pedro</nome>
		<email>pedro@dominio.com</email> 
	</Contato>
</Newsletter>

É um arquivo XML bem simples com uma lista de contatos. Nossa primeira tarefa será ler esse arquivo e imprimir as informações de cada contato na tela. Veja:

1
2
3
4
5
6
7
8
9
10
11
<?php 
$xml = simplexml_load_file('lista_contatos.xml'); /* Lê o arquivo XML e recebe um objeto com as informações */
 
/* Percorre o objeto e imprime na tela as informações de cada contato */
foreach ($xml as $contato){
    $a = "Id: " . $contato->idcontato . "<br>";
    $a .= "Nome: " . $contato->nome . "<br>";
    $a .= "Email: " . $contato->email. "<br><br>";
    echo $a;
}
?>

No exemplo acima, eu executo a função simplexml_load_file passando como parâmetro o arquivo que eu quero importar as informações. Feito isso, a função me retorna um objeto contendo todo o conteúdo do arquivo xml. Depois eu percorro esse objeto e vou exibindo na tela todos os contatos com código, nome e email.

Agora vamos supor que eu nao queira exibir essas informações e sim salvá-las no banco de dados da minha aplicação.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php 
/* Conectar com o banco de dados da aplicação */
mysql_connect('localhost', 'root', 'senha') or die('Erro ao conectar');
mysql_select_db('nomeDoBanco') or die('Erro ao conectar com o banco de dados');
 
$xml = simplexml_load_file('lista_contatos.xml'); /* Lê o arquivo XML e recebe um objeto com as informações */
 
/* Percorre o objeto e salva as informações no banco de dados */
$x = 0;
foreach ($xml as $contato){
    mysql_query("INSERT INTO contato(idcontato, nome, email) VALUES ('$contato->idcontato', '$contato->nome', '$contato->email')");
    if(mysql_affected_rows() != -1){
       $x++;
    }
}
echo "$x contatos importados com sucesso!";
?>

Nesse segundo exemplo eu fiz praticamente o mesmo processo, só que dentro do laço de repetição eu coloquei uma query para inserir as informações na tabela contato do meu banco de dados.

E pronto! Fiz a importação de uma lista de contatos e estou pronto para usá-la como bem entender.

Você pode usar essa técnica para importar um lista de clientes ou fornecedores ou mesmo uma série de notícias.

Use sua criatividade.

Abs

Siga-me no twitter: @rafaelwendel

É formado em Sistemas de Informação, pós-graduado em Sistemas de Banco de Dados e mestre em Educação com foco em Tecnologias Sociocomunitárias. Trabalha como professor de ensino técnico e tecnológico no Instituto Federal de Educação, Ciência e Tecnologia de São Paulo ministrando disciplinas nas áreas de programação, banco de dados, desenvolvimento de projetos e engenharia de software.

Posts relacionados

Comentários

    1. Olá Daniel,

      Não sei quais suas intenções com o arquivo XML. Mas no post o objetivo era ler as informações em um arquivo XML e depois inserí-las em uma tabela de um banco de dados MySQL.

      E acabo de (re)testar os scripts e está tudo funcionando perfeitamente.

      Att

  1. Fala Rafael…
    Consegui exportar os dados… Porém…
    …Não consegui fazer os dados do arquivo XML aparecer na tela. Vou tentar de novo quando chegar em casa e vou ver se funciona…

  2. Olá,
    Rafael Wendel
    não estou conseguindo importar as informações do xml para o mysql? oque devo fazer criar um banco de dados no mysql e criar tabelas ou o codigo cria as tabelas automaticamente?
    aguardo sua resposta.

  3. Parabéns pelo post! a minha dívida é: e se for o caso de ter vários arquivos dentro de uma pasta e fazer essa leitura dentro de cada um deles, claro guardando na base. como seria?

  4. Olá Rafael…

    Os dois códigos estão funcionando sem erros, porém não consigo fazer a inserção na tabela, tenho o resultado de 0 contatos importados com sucesso!…

    Com o script de leitura, sem problemas… le-se inteiro…

  5. Rafael ótimo post, era o que procurava, porém me deparei com outro problema tenho que realizar uma migração e tenho estes campos no xml

    —————
    —————————-
    ——-
    ——-
    ——-
    ——
    54.

    como pode observar o campo assunto é variavel, as vezes tem 2,3,4,5 depende de quantas linhas possui a informação. alguma ideia para resolver isto ?

    valeu…

  6. é verdade, mas enfim o problema é que eu tinha os campos

    autor ——- /autor

    titulo——/titulo

    assunto——/assunto
    assunto—–/assunto
    assunto —- /assunto

    o assunto no banco de dados real é um texto mas cada linha corresponde a um assunto —-/assunto do xml conseguiu intender ?
    ai quando tentou importar só pega a primeira linha pq a variavel das outras é igual

  7. Bom Maurício, vamos lá.

    Quando temos mais de uma tag dentro do arquivo XML, automaticamente é criado um array encadeado (um array dentro do array).

    Logo, para acessar as informações, é só colocar um outro foreach dentro do foreach

    foreach($xml as $reg){
          echo $reg->autor;
          echo $reg->titulo;
     
          foreach ($reg->assunto as $assunto){
                echo $assunto;
          }
    }

    Abs

    1. Perfeito, está funcionando corretamente agora.
      Podes ver qual o meu erro no insert, pois não estou conseguindo realizar a importação…
      outra coisa caractere como por exemplo:ç,ã,é são migrados corretamente ? porque parece que está dando esses caracteres ficam errados…
      estou utilizando:

      Autor, $record->Titulo, $record->Assunto, $record->Imprenta, $record->Registro, $record->Obra, $record->Data, $record->Chamada, $record->Tipo_de_Documento)”);
      if(mysql_affected_rows() != -1){
      $x++;

      }
      }
      echo “$x contatos importados com sucesso!”;
      ?>

        1. certo, agora que está tudo pronto percebi o seguinte erro..

          Texto exportado para o Mysql: Comentários ao Ofício nº 624/PGFN que apresenta exposição de motivos aos Anteprojetos da Execução Administrativa e da Transação Tributária.

          alguns caracteres vem com erro, sabe como posso solucionar isto ??

          valeu,

          Abraço.

          1. Banco de dados já esta utilizando utf8 eno dreamweaver já selecionei tbm a mesma codificação. outra coisa aquele código que voce me enviou para pegar apenas o assunto funciona bem , porém para adicionar no bando de dados não da certo.

  8. [sourcecode language=’php’]

    Autor, $record->Titulo, $record->Assunto, $record->Imprenta, $record->Registro, $record->Obra, $record->Data, $record->Chamada, $record->Tipo_de_Documento)”);
    if(mysql_affected_rows() != -1){
    $x++;

    }
    }
    echo “$x contatos importados com sucesso!”;
    ?>
    [/sourcecode]

  9. Olá rafael preciso importar o conteudo deste arquivo pra mysql mas não consigo adaptar o seu codigo pra pegar estes formato de xml se tiver interece posso ate te pagar pra vc fazer pra por favor da uma resposta por email.

  10. Bom dia, caro Rafael!

    Se possível gostaria que me orientasse o seguinte: Eu tenho uma com um AFILIADO onde eles disponibilizam a GERAÇÃO DE ARQUIVOS DE XML com os produtos (apostilas). Eu gostaria de Gerar uma página tipo LOJA/VITRINE a fim de mostrar os produtos no próprio site por meio de um MENU SHOPPING. Porém não sem como criar essa solução, ou seja IMPORTAR o XML para mostrar os produtos na tela de uma página.

    Desde já agradeço a atenção!

  11. Como eu faria para que ao invés de informar o xml eu informar um diretório onde será adicionado os mesmos para que ao chamar a página o php pegue os xml existentes, importe e depois mover para outro diretório?

    Obrigado.

  12. Boa noite Rafael, estou precisando abrir uma NF-e (nota fiscal eletronica) percorrer todos os produtos que vem na mesma e salvar no banco de dados mas não consigo imprimir todos os produtos com as informações. Por enquanto não estou salvando no banco. Meu codigo esta assim:
    det->prod->cEAN . “\n”.””;
    $a .= “Nome: ” .$infNFe->det->->prod->xProd . “\n”.””;
    $a .= “NCM: ” .$infNFe->det->prod->NCM . “\n”.””;
    $a .= “Unidade: ” .$infNFe->det->prod->uCom . “\n”.””;
    echo $a;
    }
    ?>
    So que ele imprime somente um dos 3 produtos do arquivo xml. Acredito que o problema esteja na função simplexml_load_file( ). Tem como me dar um help?

    1. Olá Rafael,

      Creio que o os produtos estejam encadeados, ou seja, um objetos dentro de outro objeto. Se for isso mesmo, voce faz um laço para percorrer todas as NF e dentro desse laço deve fazer outro laço para percorrer os produtos.

      Abs

  13. Boa Tarde, Rafael eu precisava fazer que código em vez de pegar apenas um arquivo especifico tipo suporte.xml ele pega-se as informações de um diretório especifico e me mostra-se em tela apenas as informações que eu peça. Você poderia me ajudar ? Desde já Obrigado!

  14. Boa tarde Rafael,
    muito bom tutorial. mas queria ver se tu me da uma luz, estou conseguindo ler o arquivo NFe xml, segue minhas modificação.
    foreach ($xml as $NFe){
    $a = “Nome: ” . $NFe->infNFe->emit->xNome . “”;
    $a .= “Numero Nota Fiscal: ” . $NFe->infNFe . “”;
    $a .= “Volume: ” . $NFe->infNFe->transp->vol->qVol . “”;
    $a .= “Valor: ” . $NFe->infNFe->total->ICMSTot->vProd . “”;
    $a .= “Data Danfe: ” . $NFe->infNFe->ide->dEmi . “”;
    echo $a;
    }

    Mas quando peço para salvar em BD, ele insere mas aparece só ex.”->emit->xNome”, segue abaixo:
    foreach ($xml as $NFe){
    mysql_query(“INSERT INTO fase01(fase01_fornecedor, fase01_nf, fase01_volume, fase01_valor, fase01_dataDanfe, fase01_status)
    VALUES (‘$NFe->infNFe->emit->xNome’, ‘2’, ‘$NFe->infNFe->transp->vol->qVol’, ‘$NFe->infNFe->total->ICMSTot->vProd’, ‘$NFe->infNFe->ide->dEmi’, ‘1’)”);

    if(mysql_affected_rows() == 0){
    $x++;
    }
    }
    echo “$x contatos importados com sucesso!”;

    O que poderia ser que ele não está entendendo.
    Obrigado desde já.

  15. Prezados, alguém tem ideia de como pegar esse id=”417721827326480784″ e esse endereço que está dentro do link url=”XXXXXX-.html” do XML ??????

    NOTEBOOK ULTRAFINO POSITIVO INTEL® CELERON® B800 ULTRA S2490 4GB HD 500GB 14” WEBCAM BLUETOOTH E WI FI WINDOWS 8

    Agradeço atenção dispensada

  16. Bom dia xará 🙂 tudo certo? Cara to com uma duvida e não to conseguindo encontrar como fazer.
    Assim, tenho um xml,php que gera o php em texto dando echo mesmo, e quero ler esse arquivo como se fosse um xml pra poder utilizar em uma pagina onde exibe informações sobre o desempenho do servidor. Já deve ter entendido o do porque de não criar o xml pra depois ler. por que a atualização da pagina vai ocorrer frequentemente e é mais rápido deste modo. Não encontrei nenhuma soluçao de como interpretar o arquivo. Alguma ideia? Obrigado 😀

  17. Rafael aparecer o xml na tela consegui fazer porém, não estou conseguindo fazer a conexão com o banco mysql, já tentei de diversas formas sabe se tem alguma configuração do mysql que pode não está conseguindo conectar?
    estou usando o mysql workbench 5.5 no ubuntu

    1. André,

      O MySQL Workbench é apenas um software cliente que se conecta ao MySQL Server. Pelo Workbench você consegue fazer as atividades triviais como inserts, updates, deletes e selects?

      Quando você se conecta via php é exibido algum erro?

      Abs!

      1. rafael o meu xml tem esse cabeçaclho por isso não estou conseguindo subir so quando excluoo ele. como faria para não ter que limpar o cabecalho.

        a
        a

        Inserir
        conteudo aqui

  18. Olá Rafael,
    Parabéns pelo tutorial! Me ajudou muito!
    Como seria se tivessem imagens no xml e eu quisesse fazer o upload delas no servidor?
    Grata,
    Renata

  19. Parabéns pelo tutorial!!!!!!!
    Funciona PERFEITO!!!!!.

    Desculpe o abuso, mas tenho um XML em que um dos ítens tem uma sub-divisão com fotos.
    São várias fotos.
    Como faço para carregar essas fotos na tela?

    Obrigado.’Abs.

  20. Parabéns Rafael,
    funcionou bem a importação, mas estou tendo problemas com caracteres especiais, como acentos, poderia me dar alguma dica pra resolver isso.

  21. eu fiz tudo cmo está no tutorial, aparece a mensagem “3 contatos importados com sucesso!”, mas quando vou olhar no banco não há nenhum registro.

  22. Boa noite a todos, estamos aqui para mais uma duvida.
    tenho um xml que contém um cabeçalho com 3 campos, e depois um tag, com o restante dos valores. Encontre aqui um foreach dentro de outro, com a mesma ideia que preciso e importar no banco mysql.
    Mas não estou conseguindo. Quem puder me ajudar agradeceria muito, e caso for até pago para fazer esse importador do xml. está assim dados exemplos: tem que importar incluindo esse 3 campos juntos

    60
    2022
    02

    87268405022
    jWBmuGXpYGuTmRqv
    06/2021
    25/2021
    2021-05-08
    4
    2021-06-06
    2
    27.00
    1500.00

    26010237084
    qwertyuiopasdfgh
    01/2021
    30/2021
    2021-01-03
    1
    2021-02-03
    6
    12.00
    600.00

  23. Eita que ficou estranho, irei tentar novamente.. Esse estrutura minina
    Sempre que que pegar os valores que estão na tag adicional, coloca esses cabeçalho junto, em todas as linhas.

    inicio– INTERNO
    Codigo–Codigo
    Exercicio—Exercicio
    Mes—Mes
    —Adicional—
    CPF—-CPF
    Matricula—Matricula
    —-Adicional——
    fim xml –INTERNO

    1. Olá Adriano, realmente ficou complicado entender qual a estrutura do seu XML. Seria algo mais ou menos assim?

      1
      2
      3
      4
      5
      6
      7
      8
      
      <?xml version='1.0' encoding='UTF-8'?> 
      <codigo>60</codigo>
      <exercicio>2022</exercicio>
      <mes>02</mes>
      <adicional>
                <cpf>87268405022</cpf>
                <matricula>jWBmuGXpYGuTmRqv</matricula>
      </adicional>

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *