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
Muito legal esse artigo.
Parabéns.
falhado…concatenando os xml… e tbm cade o put_file_contents
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
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…
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.
Olá Rodrigo.
O que está contido no arquivo XML são apenas as informações. A tabela é você quem deve criar.
No exemplo do post, você tem que criar a tabela `contato` com os atributos `idcontato`, `nome` e `email`.
Abs
td certo e parabéns…
so uma pergunta, se for mais de uma tabela? ex:
cotado
fucionario
dados
como ficaria o codigo? grato.
Basta inserir mais dois INSERTS.
Abs
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?
Olá Oliver, nesse post https://www.rafaelwendel.com/2011/07/funcao-para-listar-arquivos-de-um-diretorio/ eu mostro como listar os arquivos de um diretório (inclusive de acordo com sua extensão.
Você pode fazer isso no diretório onde está os XMLs e depois percorrer todos.
Abs
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…
Olá Gabriel, se está lendo direitinho o problema deve ser no SQL ou no nome da tabela e de seus atributos. Dê uma verificada nisso.
Abs
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…
Olá Maurício,
Deu algo errado na hora de você postar o comentário.
Como pode ver saiu apenas “underlines”.
Abs
é 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
ola mauricio como vc conseguiu subrir o arquivos com um cabecalho antes do contudo do XML, estou com o mesmo problema o meu xml tem um caveçalho antes do conteudo.
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
Abs
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!”;
?>
Provavelmente é erro de SQL.
Confira o nome da tabela e de seus atributos e veja se estás fazendo tudo correto.
Abs
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.
Olá Maurício,
Tente a função utf8_encode.
Abs
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.
não consegui colar o código completo.
[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]
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.
Olá Nelson,
Do que exatamente está precisando?
Abs
Parabéns
Seu código e fenomenal. Funciona como uma “ferrari f430 spider”
Obrigado
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!
Merval,
Faça uma pagina que consulte no BD e gere o XML com as informações. Aí todas os sites que precisarem das informações é só buscar via simplexml_load_file e exibir.
Abs
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.
Olá Flavio,
Veja esse post: https://www.rafaelwendel.com/2011/07/funcao-para-listar-arquivos-de-um-diretorio/
Com essa função você lista todos os XML de uma pasta, faz um laço para ler todos e salvar em algum lugar.
Abs
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?
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
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!
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á.
No meu não deu certo esta dando 0 contato importados.
Na verdade só copie e cole o código fonte e crie as tabelas
o que pode ser?
Olá Murilo,
Difícil analisar sem ver o código!
Abs!
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
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 😀
Olá Rafael,
Se esse arquivo .php gerar o mesmo que um arquivo XML não vejo problemas.
Abs!
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
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!
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
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
Bom tutorial, parabéns!
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.
Muito o bom o artigo, ajudou muito.
Obrigado.
Parabéns amigo! Segui seu passo a passo e deu certinho, muito obrigado e que Deus te abençoe.
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.
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.
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
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
Olá Adriano, realmente ficou complicado entender qual a estrutura do seu XML. Seria algo mais ou menos assim?