Ir para conteúdo

POWERED BY:

Arquivado

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

volanick

Ler itens XML em PHP

Recommended Posts

Tenho um código que faz a leitura de varios xml (fiscal), e grava o que encontrou em um banco de dados.
Como posso ler este arquivo, e salvar quando tem mais de 1 produto no xml? No momento ele salva apenas o primeiro item de cada arquivo xml.
foreach(glob('xml/*/*/*/{*.xml,*.XML}', GLOB_BRACE) as $xmlFile){
$xml = simplexml_load_file($xmlFile);

$chNFe= $xml->protNFe->infProt->chNFe;
$dhEmi= $xml->NFe->infNFe->ide->dhEmi;
$natOp= $xml->NFe->infNFe->ide->natOp;
$CNPJ= $xml->NFe->infNFe->emit->CNPJ;
$xNomeemit= $xml->NFe->infNFe->emit->xNome;
$xBairroemit= $xml->NFe->infNFe->emit->enderEmit->xBairro;
$xMunemit= $xml->NFe->infNFe->emit->enderEmit->xMun;
$UFemit= $xml->NFe->infNFe->emit->enderEmit->UF;
$foneemit= $xml->NFe->infNFe->emit->enderEmit->fone;
$cPaisemit= $xml->NFe->infNFe->emit->enderEmit->cPais;
$CPFdest= $xml->NFe->infNFe->dest->CPF;
$CNPJdest= $xml->NFe->infNFe->dest->CNPJ;
$xNome= $xml->NFe->infNFe->dest->xNome;
$xLgr= str_replace("'","",$xml->NFe->infNFe->dest->enderDest->xLgr);
$nro= $xml->NFe->infNFe->dest->enderDest->nro;
$xBairro= $xml->NFe->infNFe->dest->enderDest->xBairro;
$xMun= $xml->NFe->infNFe->dest->enderDest->xMun;
$UF= $xml->NFe->infNFe->dest->enderDest->UF;
$CEP= $xml->NFe->infNFe->dest->enderDest->CEP;
$cPais= $xml->NFe->infNFe->dest->enderDest->cPais;
$email= $xml->NFe->infNFe->dest->email;
$xProd= $xml->NFe->infNFe->det->prod->xProd;
$NCM= $xml->NFe->infNFe->det->prod->NCM;
$CFOP= $xml->NFe->infNFe->det->prod->CFOP;
$uCom= $xml->NFe->infNFe->det->prod->uCom;
$qCom= $xml->NFe->infNFe->det->prod->qCom;
$vProd= $xml->NFe->infNFe->det->prod->vProd;
$vUnTrib= $xml->NFe->infNFe->det->prod->vUnTrib;


$checkn = "SELECT * FROM xml WHERE chNFe = '$chNFe'";
$sqlcheckn = mysqli_query($conn, $checkn);
$rowsn = mysqli_num_rows($sqlcheckn);

if ($rowsn == 0)
{

$sql="INSERT INTO xml (
chNFe, dhEmi, natOp, CNPJ, xNomeemit, xBairroemit, xMunemit, UFemit, foneemit, cPaisemit, CPFdest, CNPJdest, xNome, xLgr, nro, xBairro, xMun, UF, CEP, cPais, email, xProd, NCM, CFOP, uCom, qCom, vProd, vUnTrib )
VALUES(
'$chNFe', '$dhEmi', '$natOp', '$CNPJ', '$xNomeemit', '$xBairroemit', '$xMunemit', '$UFemit', '$foneemit', '$cPaisemit', '$CPFdest', '$CNPJdest', '$xNome', '$xLgr', '$nro', '$xBairro', '$xMun', '$UF', '$CEP', '$cPais', '$email', '$xProd', '$NCM', '$CFOP', '$uCom', '$qCom', '$vProd', '$vUnTrib'
)";

$res = mysqli_query($conn, $sql) or die("<b>Erro (0):</b><br> $sql <br> <b>Mensagem tecnica:</b> <br>" .mysqli_error());

if(mysqli_affected_rows() != -1){
$x++;
}
echo "<br>$x registros importados com sucesso!<br>";
}
else
{

echo "<br>Jรก encontremos dados com estas notas!<br>";

}


}

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fica difícil mostrar com clareza a solução sem o arquivo XML de leitura, pois seria necessário a arquitetura do mesmo, mas criei um exemplo.

<?xml version="1.0" encoding="UTF-8"?>
<exemplo>
    <indice>
        <valor>Exemplo A</valor>
        <valor>Exemplo B</valor>
        <valor>Exemplo C</valor>
    </indice>
</exemplo>

Então com esse xml aí quero pegar cada valor dentro do índice:

<?php
$xml = simplexml_load_file('arquivo.xml');
foreach ($xml->indice->valor as $value) {
    echo $value . '<br>';
}

Ou seja o $value é cada valor dentro do índice no xml. E como está dentro de um loop de repetição ele vai me indexar cada valor existente.

Então é simples bastando executar a query dentro dessa repetição.

 

No entanto queria levantar uma coisa aqui.

Qual a necessidade de registrar um ou mais xml, ir lendo eles e registrar suas características?

Porque a única forma de executar seria dentro de um loop, e dependendo da quantidade de fluxo ao qual deverá lançar registros, pode sobrecarregar seu SQL só com um arquivo XML o que dirá vários.

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por violin101
      Caros amigos, saudações.
       
      Por favor, poderiam me ajudar.

      Estou com a seguinte dúvida:
      --> como faço para para implementar o input código do produto, para quando o usuário digitar o ID o sistema espera de 1s a 2s, sem ter que pressionar a tecla ENTER.

      exemplo:
      código   ----   descrição
           1       -----   produto_A
       
      Grato,
       
      Cesar
    • Por daemon
      Boa tarde,
       
      Duvida simples...
       
      Quando recupero os dados RSS, para inserir no banco de dados esta salvando corretamento porém no mysql esta com (ponto) . na frente de todos os registros via RSS.
       
      Fica com um ponto na frente outro atras...
       
      Data/hora:
      .2024-11-30 10:03:47.
    • Por violin101
      Caros amigos, saudações.
       
      Humildemente peço desculpa por postar uma dúvida que tenho.

      Preciso salvar no MySql, os seguinte Registro:

      1 - Principal
      ====> minha dúvida começa aqui
      ==========> como faço para o Sistema Contar Automaticamente o que estiver despois do 1.____?
      1.01 - Matriz
      1.01.0001 - Estoque
      1.01.0002 - Oficina
      etc

      2 - Secundário
      2.01 - Loja_1
      2.01.0001 - Caixa
      2.01.0002 - Recepção
      etc
       
      Resumindo seria como se fosse um Cadastro de PLANO de CONTAS CONTÁBEIL.

      Grato,


      Cesar









       
    • Por violin101
      Caros amigos, saudações.

      Por favor, me perdoa em recorrer a orientação dos amigos.

      Preciso fazer um Relatório onde o usuário pode Gerar uma Lista com prazo para vencimento de: 15 / 20/ 30 dias da data atual.

      Tem como montar uma SQL para o sistema fazer uma busca no MySql por período ou dias próximo ao vencimento ?

      Tentei fazer assim, mas o SQL me traz tudo:
      $query = "SELECT faturamento.*, DATE_ADD(faturamento.dataVencimento, INTERVAL 30 DAY), fornecedor.* FROM faturamento INNER JOIN fornecedor ON fornecedor.idfornecedor = faturamento.id_fornecedor WHERE faturamento.statusFatur = 1 ORDER BY faturamento.idFaturamento $ordenar ";  
      Grato,
       
      Cesar
       
       
       
       
    • Por violin101
      Caros amigos, saudações
       
      Por favor, me perdoa em recorrer a orientação dos amigos, tenho uma dúvida.
       
      Gostaria de uma rotina onde o Sistema possa acusar para o usuário antes dos 30 dias, grifar na Tabela o aviso de vencimento próximo, por exemplo:
       
      Data Atual: 15/11/2024
                                           Vencimento
      Fornecedor.....................Data.....................Valor
      Fornecedor_1...........01/12/2024..........R$ 120,00 <== grifar a linha de Laranja
      Fornecedor_1...........01/01/2025..........R$ 130,00
      Fornecedor_2...........15/12/2024..........R$ 200,00 <== grifar a linha de Amarelo
      Fornecedor_2...........15/01/2025..........R$ 230,00
      Fornecedor_3...........20/12/2024..........R$ 150,00
       
      Alguém tem alguma dica ou leitura sobre este assunto ?

      Grato,
       
      Cesar
×

Informação importante

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