Marcio_123 1 Denunciar post Postado Julho 1, 2017 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
Kosonome 31 Denunciar post Postado Julho 1, 2017 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
Marcio_123 1 Denunciar post Postado Julho 1, 2017 esqueci de mencionar alem do cabeçalho tambem preciso excluir no final do XML o elemento <_Despesa> pois este fecha o cabeçalho. Compartilhar este post Link para o post Compartilhar em outros sites
Kosonome 31 Denunciar post Postado Julho 1, 2017 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
Marcio_123 1 Denunciar post Postado Julho 1, 2017 vou testar pra ver. Compartilhar este post Link para o post Compartilhar em outros sites
Marcio_123 1 Denunciar post Postado Setembro 6, 2017 ola Kosonome não deu certo em brhoter ele não lê nada usando aquela sequencia que você falou. ate tirei o echo $_Despesa->co_despesa; mas ele tambem não lê Compartilhar este post Link para o post Compartilhar em outros sites
Marcio_123 1 Denunciar post Postado Setembro 6, 2017 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
Osmar L Lima 51 Denunciar post Postado Setembro 6, 2017 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
Mateus Silva 64 Denunciar post Postado Setembro 8, 2017 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
Marcio_123 1 Denunciar post Postado Setembro 11, 2017 É 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
Mateus Silva 64 Denunciar post Postado Setembro 12, 2017 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