Ir para conteúdo

POWERED BY:

Arquivado

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

jeterjr

Ler arquivo XML da NF-e (Nota Fiscal Eletrônica)

Recommended Posts

Olá a todos é um grande prazer fazer parte deste fórum, e este é meu primeiro tópico. Sou novo no fórum e estou iniciando no PHP, qualquer coisa que estiver fora do normal em minha postagem fiquem a vontade em me avisar.

 

Estou desenvolvendo um script para ler alguns dados do arquivo XML da NF-e e para surpresa de um iniciante tenho conseguido algum resultado. Tudo vinha correndo bem até que me deparei com a dificuldade de ler alguns arquivos. vou colocar abaixo o que encontrei de diferente nas primeiras linhas do arquivo xml, ao menos acho que possa ser alguma coisa relacionado a isso.

 

Arquivo que não consego ler
<NFe xmlns="http://www.portalfiscal.inf.br/nfe"><infNFe versao="2.00" Id="NFe27130812440541000110550010000038031000304248"><ide>
Arquivo que consegui fazer a leitura normalmente
<?xml version="1.0" encoding="utf-8" ?><nfeProc xmlns="http://www.portalfiscal.inf.br/nfe" versao="2.00"><NFe xmlns="http://www.portalfiscal.inf.br/nfe"><infNFe versao="2.00" Id="NFe27130412440541000110550010000025351000202800"><ide>
Segue script.
<?php
$dir = 'memorizar/'; // Diretório do arquivo
$pasta= opendir($dir); // Abrindo o diretório
while ($arquivo = readdir($pasta)){ // lendo os arquivos do diretorio
//Verificacao para pegar apenas os arquivos e ignorar as pastas
if ($arquivo != '.' && $arquivo != '..'){
//Começamos agora a leitura do arquivo XML.
$arquivo = simplexml_load_file("memorizar/$arquivo");
foreach($arquivo->NFe as $key => $xml)
{
$NUMERO = "".$xml->infNFe->ide->nNF.""; //NUMERO NFE
$RZ_EMITENTE = "".$xml->infNFe->emit->xNome.""; //RAZÃO EMITENTE
$CNPJ_EMIT = "".$xml->infNFe->emit->CNPJ.""; // CNPJ EMITENTE
$DATA_EMIT = "".$xml->infNFe->ide->dEmi.""; // DATA EMISSÃO
$VALOR_TOT = "".$xml->infNFe->total ->ICMSTot->vNF."";//VALOR NF-E
$CNPJ_DEST = "".$xml->infNFe->dest->CNPJ.""; // CNPJ DESTINATÁRIO
$RZ_DESTIN = "".$xml->infNFe->dest->xNome.""; // RAZÃO DESTINATÁRIO
// exibindo os dados coletados
echo "Emitente: "."$RZ_EMITENTE <br>";
echo "$CNPJ_EMIT <br> ";
echo "$DATA_EMIT <br> ";
echo "$NUMERO <br>";
echo "$VALOR_TOT <br>";
echo "Destinatário: "."$RZ_DESTIN <br>";
echo "$CNPJ_DEST <br>";
echo "<br>";
}
}
}

?>

 

Desde já agradeço qualquer ajuda obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

O simplexml_load_file traduz o conteúdo do arquivo para um objeto. Porém, se o arquivo não estiver devidamente estruturado, ele vai dar erro mesmo. Como o primeiro arquivo não possui a tag de abertura (<?xml), ele não consegue abrir.

 

Talvez a melhor solução seria fazer um pré-script que coloca essa tag no início do arquivo se não existir.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Obrigado Massaki! sua dica me ajudou a solucionar parte do problema, realmente precisa ser alterada informações no arquivo XML. O que ocorre é que alguns arquivos possui a TAG raiz <nfeProc e claro no inicio e no fim do arquivo </nfeProc>, Foi apenas adicionar e funcionou.

 

Agora a outra parte do problema é incluir via PHP esta TAG no inicio e no fim do arquivo antes mesmo de fazer a leirura do mesmo, Como é algo que nunca fiz continuo grato se alguém puder me ajudar. Vou ler a respeito de incluir dados em arquivos xml através do PHP e qualquer novidade posto aqui! Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado Massaki! sua dica me ajudou a solucionar parte do problema, realmente precisa ser alterada informações no arquivo XML. O que ocorre é que alguns arquivos possui a TAG raiz <nfeProc e claro no inicio e no fim do arquivo </nfeProc>, Foi apenas adicionar e funcionou.

 

Agora a outra parte do problema é incluir via PHP esta TAG no inicio e no fim do arquivo antes mesmo de fazer a leirura do mesmo, Como é algo que nunca fiz continuo grato se alguém puder me ajudar. Vou ler a respeito de incluir dados em arquivos xml através do PHP e qualquer novidade posto aqui! Obrigado!

 

Estou fazendo a mesma coisa, @jeterjr.

Já li todos os dados da NF-e.

 

Porém, estou fazendo uma importação dos dados.

Gerando o pedido, e implantando a nota no sistema.

 

Se precisar de ajudar, só avisar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faz o seguinte:

 

$conteudo = file_get_contents($arquivo);

$temnfeproc = strpos('<nfeProc', $conteudo);
if ( $temnfeproc === false) {
  $conteudo = str_replace('<NFe', '<nfeProc xmlns="http://www.portalfiscal.inf.br/nfe" versao="2.00"><NFe', $conteudo);
  $conteudo = str_replace('</NFe>', '</NFe></nfeProc>', $conteudo);
}
Assim, ele testa antes de colocar a tag 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Arquivo que não consego ler
<NFe xmlns="http://www.portalfiscal.inf.br/nfe"><infNFe versao="2.00" Id="NFe27130812440541000110550010000038031000304248"><ide>
Arquivo que consegui fazer a leitura normalmente
<?xml version="1.0" encoding="utf-8" ?><nfeProc xmlns="http://www.portalfiscal.inf.br/nfe" versao="2.00"><NFe xmlns="http://www.portalfiscal.inf.br/nfe"><infNFe versao="2.00" Id="NFe27130412440541000110550010000025351000202800"><ide>

 

A que você não consegue ler, é pra pegar a chave de acesso ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

A que você não consegue ler, é pra pegar a chave de acesso ?

Welington obrigado pela atenção! no exemplo que mostrei acima meu problema estava em ler o arquivo xml e pegar qualquer dado o que acontece é que consigo ler com o script que montei alguns XMLs da NF-e e outros não. E a respeito da chave de acesso tentei pegar e não consegui, talvez eu não tenha conseguido montar com os nós correto. Você saberia me informar com consigo a chave do arquivo?

 

Vou tentar usar a dica do Massaki para ler o XML e incluir a TAG que em alguns arquivos não possuem. Caso você tenha uma forma diferente de ler o XML e puder compartilhar eu agradeço.

 

 

Faz o seguinte:

 

$conteudo = file_get_contents($arquivo);

$temnfeproc = strpos('<nfeProc', $conteudo);
if ( $temnfeproc === false) {
  $conteudo = str_replace('<NFe', '<nfeProc xmlns="http://www.portalfiscal.inf.br/nfe" versao="2.00"><NFe', $conteudo);
  $conteudo = str_replace('</NFe>', '</NFe></nfeProc>', $conteudo);
}
Assim, ele testa antes de colocar a tag 

Vou tentar usar sua dica agora mesmo qualquer coisa já posto aqui! por enquanto muito obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal é seguinte implementei o código que o Massaki postou e como não conhecia as funções utilizadas pesquisei uma a uma para entender o código.

Bom o código funciona, mas minha dúvida agora é como extrair os dados contidos entre as tags que eu desejar pois tentei utilizar o foreach como no código que postei acima e não deu certo.

 

Nesta aplicação o que preciso fazer é pegar alguns dados do XML da NF-e guardar em variáveis para posteriormente enviar para base de dados. o restante do código desta aplicação está funcionando perfeitamente minha dificuldade está em ler os XMLs. espero que estejam entendendo minhas dúvidas pois ainda estou engatinhando na programação,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estude sobre DOMDocument

 

Exemplo:

$filename = 'file.xml';
$DOMDocument = new DOMDocument( '1.0', 'UTF-8' );
$DOMDocument->preserveWhiteSpace = false;
$DOMDocument->load( $filename );
$products = $DOMDocument->getElementsByTagName( 'prod' );

foreach( $products as $product )
{
    printf( '<strong>Produto:</strong> %s<br/>
             <strong>Valor:</strong> %01.2f<br/>', 
            $product->getElementsByTagName( 'xProd' )->item( 0 )->nodeValue,
            $product->getElementsByTagName( 'vUnCom' )->item( 0 )->nodeValue
    );
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estude sobre DOMDocument

 

Exemplo:

$filename = 'file.xml';
$DOMDocument = new DOMDocument( '1.0', 'UTF-8' );
$DOMDocument->preserveWhiteSpace = false;
$DOMDocument->load( $filename );
$products = $DOMDocument->getElementsByTagName( 'prod' );

foreach( $products as $product )
{
    printf( '<strong>Produto:</strong> %s<br/>
             <strong>Valor:</strong> %01.2f<br/>', 
            $product->getElementsByTagName( 'xProd' )->item( 0 )->nodeValue,
            $product->getElementsByTagName( 'vUnCom' )->item( 0 )->nodeValue
    );
}

Carlos seu script funcionou perfeitamente o que fiz foi apenas incluir campos para buscas de valores que eu preciso. E pessoal ainda me resta uma divida como pegar a chave da NF-e? alguém já passou por está experiência e poderia dar uma força?

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema é que vc simplesmente copiou e colou, não se deu ao trabalho de estudar a classe.

 

Para pegar os valores contidos nos atributos é simples:

$DOMDocument->getElementsByTagName( 'infNFe' )->item( 0 )->getAttribute( 'Id' );

Compartilhar este post


Link para o post
Compartilhar em outros sites

@jeterjr

 

Olha eu montei a chave de acesso, de acordo com a norma técnica.

 

 

//{CHAVE DE ACESSO}//
$cUF = $item->infNFe->ide->cUF;
$Ano = $item->infNFe->ide->dEmi; //fazer copy
$Ano = substr($Ano,2,2);
$Mes = $item->infNFe->ide->dEmi; //fazer copy
$Mes = substr($Mes,5,2);
$CNPJ = $item->infNFe->emit->CNPJ;
$modelo = $item->infNFe->ide->mod;
$serie = $item->infNFe->ide->serie;
$serie = str_pad($serie,3, "0", STR_PAD_LEFT);
$numero = $item->infNFe->ide->nNF;
$numero = str_pad($numero,9, "0", STR_PAD_LEFT);
$tpEmis = $item->infNFe->ide->tpEmis;
$codigoSeguranca = $item->infNFe->ide->cNF;
$cDV = $item->infNFe->ide->cDV;
$C_NFENUM = $cUF.$Ano.$Mes.$CNPJ.$modelo.$serie.$numero.$tpEmis.$codigoSeguranca.$cDV;

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

O problema é que vc simplesmente copiou e colou, não se deu ao trabalho de estudar a classe.

 

Para pegar os valores contidos nos atributos é simples:

$DOMDocument->getElementsByTagName( 'infNFe' )->item( 0 )->getAttribute( 'Id' );

Olá Carlos Coelho obrigado por me ajudar! Na minha ansiedade em ver o código funcionando confesso, realmente errei em não estudar a classe. Pode ter certeza suas simples palavras foram para mim uma lição e não cometerei este erro novamente afinal o maior prejudicado sou eu que estou aprendendo.

 

 

Obrigado pela atenção Welington. Você esta usando o simplexml_load_file() sem ter problemas com leitura de arquivo vindo de emitentes diferentes? eu quebrei bastante a cabeça tentando fazer funcionar com os diferentes arquivos XML que preciso ler. se você usa para ler só um tipo de arquivo e quiser testar com arquivos diferentes como os que eu estava tendo problema posso te enviar para você testar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pela atenção Welington. Você esta usando o simplexml_load_file() sem ter problemas com leitura de arquivo vindo de emitentes diferentes? eu quebrei bastante a cabeça tentando fazer funcionar com os diferentes arquivos XML que preciso ler. se você usa para ler só um tipo de arquivo e quiser testar com arquivos diferentes como os que eu estava tendo problema posso te enviar para você testar.

 

@jeterjr

 

Estou lendo arquivos xml's sem problemas algum, tanto de entrada/saída.

Não tive problemas em relação a ler as xmls.

 

No meu caso, eu leio todos os dados: Inclusive os impostos de cada produto, cnpj ou cpf, CFOP, faço todas as verificações como exemplo:

 

	//CST 00
		if ($item->infNFe->det->imposto->ICMS->ICMS00){
			$orig = $item->infNFe->det->imposto->ICMS->ICMS00->orig;
			$CST = $item->infNFe->det->imposto->ICMS->ICMS00->CST;
			$modBC = $item->infNFe->det->imposto->ICMS->ICMS00->modBC;
			$pRedBC = 0.00;
			$vBC = $item->infNFe->det->imposto->ICMS->ICMS00->vBC;
			$pICMS = $item->infNFe->det->imposto->ICMS->ICMS00->pICMS;
			$vICMS = $item->infNFe->det->imposto->ICMS->ICMS00->vICMS;
			$modBCST = 0.00;
			$pMVAST = 0.00;
			$pREDBCST = 0.00;
			$vBCST = 0.00;
			$pICMSST = 0.00;
			$vICMSST = 0;
			$UFST = 0;
			$pBCop = 0;
			$vBCSTRet = 0.00;
			$vICMSSTRet = 0.00;
			$motDesICMS = 0.00;
			$vBCSTDest = 0.00;
			$vICMSSTDest = 0.00;
			$pCredSN = 0;
			$vCredICMSSN = 0.00;	
		}
		
		//CST 10
		if ($item->infNFe->det->imposto->ICMS->ICMS10){
			$orig = $item->infNFe->det->imposto->ICMS->ICMS10->orig;
			$CST = $item->infNFe->det->imposto->ICMS->ICMS10->CST;
			$modBC = $item->infNFe->det->imposto->ICMS->ICMS10->modBC;
			$pRedBC = 0.00;
			$vBC = $item->infNFe->det->imposto->ICMS->ICMS10->vBC;
			$pICMS = $item->infNFe->det->imposto->ICMS->ICMS10->pICMS;
			$vICMS = $item->infNFe->det->imposto->ICMS->ICMS10->vICMS;
			$modBCST = $item->infNFe->det->imposto->ICMS->ICMS10->modBCST;
			$pMVAST = $item->infNFe->det->imposto->ICMS->ICMS10->pMVAST;
			$pREDBCST = 0.00; //informa se quizer
			$vBCST = $item->infNFe->det->imposto->ICMS->ICMS10->vBCST;
			$pICMSST = $item->infNFe->det->imposto->ICMS->ICMS10->pICMSST;
			$vICMSST = $item->infNFe->det->imposto->ICMS->ICMS10->vICMSST;
			$UFST = 0;
			$pBCop = 0;
			$vBCSTRet = 0.00;
			$vICMSSTRet = 0.00;
			$motDesICMS = 0.00;
			$vBCSTDest = 0.00;
			$vICMSSTDest = 0.00;
			$pCredSN = 0;
		}	

Como o exemplo acima, eu verifico tag a tag para preencher, pois na importação, nunca saberei qual tag estará na nota.

Deu pra entender?

 

Qualquer coisa, só me perguntar.

 

Meu problema é quando tento importa-lá para meu banco de dados, estou com dificuldades.

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.