Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Marcio_123

Importar arquivo xml - php e mysql

Recommended Posts

Ola pessoal, estou importando um arquivos xml que é gerado a partir de um programa LOCAL. Uso o script abaixo para ler e importar para o mysql.

<?
ini_set('default_charset', 'UTF-8');

/* PEGA O ARQUIVO XML */
        if (isset($_POST['enviar_xml'])) {          
        if (is_uploaded_file($_FILES['upl']['tmp_name'])) {
      	$xml = simplexml_load_file($_FILES['upl']['tmp_name']); /* Lê o arquivo XML e recebe um objeto com as informações */            
	}
}
 
/* FAZ A GRAVAÇÃO DO XML NO BANCO */
    $x = 0;
foreach ($xml as $Despesa){

    mysql_query("INSERT INTO tb_despesas (co_despesa, dt_referencia, de_orgao, tp_despesa, nu_empenho, id_despesa, de_despesa, dt_emissao) 
					VALUES 
				('$Despesa->co_despesa',
                '$Despesa->dt_referencia',
                '$Despesa->de_orgao',
                '$Despesa->tp_despesa',
                '$Despesa->nu_empenho',
                '$Despesa->id_despesa',
                '$Despesa->de_despesa',
                '$Despesa->dt_emissao')");
    if(mysql_affected_rows() != -1){
       $x++;
    }
}	
/* MENSAGEM APOS GRAVAÇÃO */
$mgs = "$palavra Inserido com Sucesso. Foram importados $x registros!";

?>

o que ocorre é que o XML vem com um cabeçalho, e o arquivo so é importado quando eu excluo o cabeçalho. VEJAM as linhas em vervelho seriam o cabeçalho. Se eu não excluir não consigo fazer a importação via upload para o mysql.

 

<?xml version="1.0" encoding="utf-8"?>
<_Despesa xmlns="http://tempuri.org/">
<usuario>
<Login>ws_448</Login>
<Senha>ws_448_692</Senha>
</usuario>
<acao>Inserir</acao>

<listDespesa>
<Despesa>
<co_despesa>11</co_despesa>
<dt_referencia>2017-06-28</dt_referencia>
<de_orgao>SECRETARIA</de_orgao>
<tp_despesa>VALOR - ESTIMATIVO</tp_despesa>
<nu_empenho>35</nu_empenho>
<id_despesa>002.558.780/0025-97</id_despesa>
<de_despesa>ELEKTRO - ELETRICIDADE E SERVICOS S/A</de_despesa>
<dt_emissao>2017-06-28</dt_emissao>
</Despesa>
</listDespesa>

Compartilhar este post


Link para o post
Compartilhar em outros sites

O primeiro elemento "<_Despesa>" precisa ser fechado por um "</_Despesa>" suponho. Quando você remove o <_Despesa>, o erro deve sumir porque você não precisa mais fechá-lo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então quando você tentar mandar o "foreach" com o $xml incluindo este cabeçalho, talvez você precise algo assim:

foreach ($xml->listDespesa as $Despesa) {
    echo $_Despesa->co_despesa;
}

Afinal, quando você tira o <_Despesa>, o elemento raíz que engloba todos os outros, passa a ser o <listDespesa> (que é o $xml).

Quando você coloca o <_Despesa>, o elemento raíz que engloba todos os outros passa a ser <_Despesa>, e o <listDespesa> está dentro do <_Despesa>.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal alguem pode me dar uma dica. meu XML tem um cabecalho/rodape, so consigo importar via upload quando excluo manual essas linhas em vermelho

 

<?xml version="1.0" encoding="utf-8"?>
<_Despesa xmlns="http://tempuri.org/">
<usuario>
<Login>a</Login>
<Senha>a</Senha>
</usuario>
<acao>Inserir</acao>

<listDespesa>
<Despesa>
<campo1>Nome</campo1>
<campo2>e-mail</campo2>
<campo3>telefone</campo3>
</Despesa>
</listDespesa>
</_Despesa>

 

estou usando esse script que da certo, mas tenho que entrar no XML e excluir as linhas antes de importar.

/* PEGA O ARQUIVO XML */
        if (isset($_POST['enviar_xml'])) {          
        if (is_uploaded_file($_FILES['upl']['tmp_name'])) {
      	$xml = simplexml_load_file($_FILES['upl']['tmp_name']); /* Lê o arquivo XML e recebe um objeto com as informações */            
	}
}

$x = 0;
foreach ($xml as $Despesa){
    mysql_query( "INSERT INTO minha_tabela (
			nome,
			email,
			telefone
		) VALUES (
			'$Despesa->nome', 
			'$Despesa->email',
			'$Despesa->telefone')"
			);
    if(mysql_affected_rows() != -1){
       $x++;
    }
}


 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se o cabeçalho e o rodapé do arquivo for sempre o mesmo então você pega o conteúdo do arquivo via função file_get_contents, depois com a função str_replace você remove as partes que não te interessa e o depois trabalhe em cima da string que restou.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Lembre-se: você precisa partir da raíz do objeto pra chegar à um atributo, ou seja:

Seu xml está estruturado dessa forma:

<_Despesa>
  <listDespesa>
    <Despesa>
      <nome><![CDATA[Nome da Desesa]]></nome>
    </Despesa>
  </listDespesa>
</_Despesa>

Pra chegar na sua lista de despesas o caminho seria:

 

_Despesa -> listDespesa -> Despesa[index] -> nome

 

Ou seja, no seu código, o foreach deveria estar assim:

<?php
$xml = simple_xml_load_file($arquivo_xml);
foreach($xml->_Despesa->listDespesa AS $despesa){
	echo $despesa->nome; // No meu exemplo XML, printaria "Nome da Despesa"
}

Acho que deu pra entender, espero que ajude, abraços!

Compartilhar este post


Link para o post
Compartilhar em outros sites

É mateus pela logica seria isso mesmo, mas mostrou esse erro.

 

Warning: Invalid argument supplied for foreach() in importacao.php on line 55

 

ou seja, na linha onde esta o foreach ($xml->_Despesa->listDespesa as $Despesa) {

Compartilhar este post


Link para o post
Compartilhar em outros sites
5 horas atrás, Marcio_123 disse:

É mateus pela logica seria isso mesmo, mas mostrou esse erro.

 

Warning: Invalid argument supplied for foreach() in importacao.php on line 55

 

ou seja, na linha onde esta o foreach ($xml->_Despesa->listDespesa as $Despesa) {

 

Este erro ocorre porque a variável $xml não é um objeto, debugue ela, veja se está carregando o arquivo correto no load_file e caso esteja, verifique a sintaxe do XML dentro do arquivo

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.