Jump to content

dev botao

Validação de XML


Go to solution Solved by Italo Giurizzato Junior,
  • Este tópico foi criado há 1450 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

  • Membros Pro

Bom dia,

Estou tentando validar o xml anexo com ACBrNFe1.NotasFiscais.Validar...

ocorre o erro "...no matching global declarationo available...'' (print em anexo).

No validador da SEFAZ-RS não dá nenhum erro.

Para adiantar uma possível análise, informe que relatei a situação chat do SAC e tive a resposta: "Big Wings: Testei aqui pelo Notepad++, validando o XML todo contra o schema procNFe_v4.00.xsd ele valida, mas se extrair o grupo <NFe> e validar contra o nfe_v4.00.xsd, que é o que o ACBr faz, causa erro de validação.

Acho melhor abrir um tópico no fórum".

Alguma sugestão da causa/solução dessa situação?

Obrigado.
 

 

ErroValidar.png

validaSEFAZ.png

50201004970863000142550010000110291706594010-NFe.xml

Valdir Dill

Rio de Janeiro - RJ

 

 

Link to comment
Share on other sites

  • Consultores

Bom dia Valdir,

Você pode incluir o namespace na tag NFe sem nenhum problema.

O que não pode é alterar alguma tag que esta dentro do grupo infNFe.

Quando a assinatura é realizada no XML da NF-e, ela leva em consideração o conteúdo do grupo infNFe.

A tag NFe esta fora desse grupo, logo incluir o namespace que esta faltando não vai alterar em nada na autenticidade da nota.

Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / Araraquara-SP

Araraquara - A era dos Trólebus

Link to comment
Share on other sites

  • Membros Pro

Não entendi.

Eu estou ciente que uma vírgula que seja alterada no XML vai invalidar o XML todo.

Mas não foi esse o caso. Esse XML é um arquivo baixado pelo usuário direto do portal da SEFAZ.

Outro ponto, como já mencionei, é que o XML é validado no validador da SEFAZ-RS.

Obrigado.

Valdir Dill

Rio de Janeiro - RJ

 

 

Link to comment
Share on other sites

  • Consultores

Valdir,

Se você alterar uma virgula dentro do grupo <infNFe> vai invalidar o XML, sim.

Mas não é isso que você vai fazer.

Você vai incluir o namespace na tag NFe que esta fora do grupo <infNFe>, logo não vai invalidar o XML.

O validador da SEFAZ pode até validar o XML sem o namespace, mas o validador do ACBr não valida.

 

Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / Araraquara-SP

Araraquara - A era dos Trólebus

Link to comment
Share on other sites

  • Consultores

Valdir,

Vamos aos porquês.

Porque no validar da SEFAZ diz que o XML é valido?

Simples, se o XML possuir a tag procNFe o validador da SEFAZ se utiliza do schema procNFe_v4.00.xsd, se não tem a tag e sim a tag NFe ele usa o schema nfe_v4.00.xsd para validar o XML.

O tem XML possui a tag procNFe e esta tem o namespace, logo ele é validado com sucesso.

 

Porque no validador do ACBrNFe diz que o XML é invalido?

Simples, o componente extrai da tag procNFe a tag NFe e suas filhas e usa o schema nfe_v4.00.xsd para validar, como a tag NFe esta sem o namespace ocorre o erro.

O componente tem esse comportamento de pegar somente a tag NFe e suas filhas para validar, pois antes de enviar a nota para a SEFAZ a mesma é validade e o XML antes do seu envio não tem a tag procNFe.

 

Analisando o código do componente notamos que é mais simples acrescentar o namespace caso este não exista no momento da validação em vez de trocar os schemas.

O XML original não é afetado, pois tudo ocorre em memória e o XML é validade sem ocorre o erro por falta de namespace.

  • Like 1
Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / Araraquara-SP

Araraquara - A era dos Trólebus

Link to comment
Share on other sites

  • Membros Pro
4 minutos atrás, Italo Jurisato Junior disse:

Valdir,

Vamos aos porquês.

Porque no validar da SEFAZ diz que o XML é valido?

Simples, se o XML possuir a tag procNFe o validador da SEFAZ se utiliza do schema procNFe_v4.00.xsd, se não tem a tag e sim a tag NFe ele usa o schema nfe_v4.00.xsd para validar o XML.

O tem XML possui a tag procNFe e esta tem o namespace, logo ele é validado com sucesso.

 

Porque no validador do ACBrNFe diz que o XML é invalido?

Simples, o componente extrai da tag procNFe a tag NFe e suas filhas e usa o schema nfe_v4.00.xsd para validar, como a tag NFe esta sem o namespace ocorre o erro.

O componente tem esse comportamento de pegar somente a tag NFe e suas filhas para validar, pois antes de enviar a nota para a SEFAZ a mesma é validade e o XML antes do seu envio não tem a tag procNFe.

 

Analisando o código do componente notamos que é mais simples acrescentar o namespace caso este não exista no momento da validação em vez de trocar os schemas.

O XML original não é afetado, pois tudo ocorre em memória e o XML é validade sem ocorre o erro por falta de namespace.

Certo, entendi.

Então o XML que fica lá na SEFAZ não é o mesmo daquele gerado pelo sistema (via Acbr)? Porque a pergunta? porque antes do nosso sistema enviar o XML é feita a validação dele e valida, tudo certo. Porém, agora, ao tentar fazer a mesma validação, mas no arquivo baixado do portal, dá o erro. 

Portanto, se antes validade e agora não...me perdoe se estou falando besteira, rs...mas é o que eu entendi da situação.

Valdir Dill

Rio de Janeiro - RJ

 

 

Link to comment
Share on other sites

  • Consultores

Boa tarde Valdir,

Eu não sei como a SEFAZ trabalha.

Se ela disponibiliza o mesmo XML enviado para você realizar o Download ou se ela gera um novo com base nos dados contidos no XML enviado.

Pelo jeito a SEFAZ-MS deve gerar um novo XML, outra coisa que não sei se você notou esse XML que você baixou possui 2 assinaturas.

Uma é do emitente e a outra é da SEFAZ que se encontra dentro do grupo protNFe.

Não sei se são todas, mas existem SEFAZ que ao baixar o XML da nota caso tenha eventos vinculados a mesma como por exemplo carta de correção, o XML referente aos eventos fazem parte do XML da nota, ou seja, um XML só contendo os dados da nota mais os dados dos eventos.

Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / Araraquara-SP

Araraquara - A era dos Trólebus

Link to comment
Share on other sites

  • Membros Pro
1 hora atrás, Italo Jurisato Junior disse:

Boa tarde Valdir,

Eu não sei como a SEFAZ trabalha.

Se ela disponibiliza o mesmo XML enviado para você realizar o Download ou se ela gera um novo com base nos dados contidos no XML enviado.

Pelo jeito a SEFAZ-MS deve gerar um novo XML, outra coisa que não sei se você notou esse XML que você baixou possui 2 assinaturas.

Uma é do emitente e a outra é da SEFAZ que se encontra dentro do grupo protNFe.

Não sei se são todas, mas existem SEFAZ que ao baixar o XML da nota caso tenha eventos vinculados a mesma como por exemplo carta de correção, o XML referente aos eventos fazem parte do XML da nota, ou seja, um XML só contendo os dados da nota mais os dados dos eventos.

Ok. Entendido.

Só mais uma questão: você poderia me dar uma ajudazinha, rs, em relação ao código para incluir esse namespace no XML antes de validá-lo? 

Pelo que você fala, parece ser coisa simples, mas não estou sabendo começar, rs...

Obrigado.

Valdir Dill

Rio de Janeiro - RJ

 

 

Link to comment
Share on other sites

  • Consultores
  • Solution

Valdir,

Na unit ACBrNFeNotasFiscais procure pela função ObterNFeXML.

Ela tem que ficar da seguinte forma:

function NotaFiscal.ObterNFeXML(const AXML: String): String;
var
  DeclaracaoXML: String;
begin
  DeclaracaoXML := ObtemDeclaracaoXML(AXML);

  Result := RetornarConteudoEntre(AXML, '<NFe xmlns', '</NFe>');
  if not EstaVazio(Result) then
    Result := '<NFe xmlns' + Result + '</NFe>'
  else
  begin
    Result := LerTagXML(AXML, 'NFe');
    if not EstaVazio(Result) then
      Result := '<NFe xmlns="' + ACBRNFE_NAMESPACE +'">' + Result + '</NFe>'
  end;

  if not EstaVazio(Result) then
    Result := DeclaracaoXML + Result;
end;

A linha que devemos alterar é a linha:

Result := '<NFe>' + Result + '</NFe>'

o correto é:

Result := '<NFe xmlns="' + ACBRNFE_NAMESPACE +'">' + Result + '</NFe>' 

  • Like 4
Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / Araraquara-SP

Araraquara - A era dos Trólebus

Link to comment
Share on other sites

  • Membros Pro
4 minutos atrás, Italo Jurisato Junior disse:

Valdir,

Na unit ACBrNFeNotasFiscais procure pela função ObterNFeXML.

Ela tem que ficar da seguinte forma:


function NotaFiscal.ObterNFeXML(const AXML: String): String;
var
  DeclaracaoXML: String;
begin
  DeclaracaoXML := ObtemDeclaracaoXML(AXML);

  Result := RetornarConteudoEntre(AXML, '<NFe xmlns', '</NFe>');
  if not EstaVazio(Result) then
    Result := '<NFe xmlns' + Result + '</NFe>'
  else
  begin
    Result := LerTagXML(AXML, 'NFe');
    if not EstaVazio(Result) then
      Result := '<NFe xmlns="' + ACBRNFE_NAMESPACE +'">' + Result + '</NFe>'
  end;

  if not EstaVazio(Result) then
    Result := DeclaracaoXML + Result;
end;

A linha que devemos alterar é a linha:

Result := '<NFe>' + Result + '</NFe>'

o correto é:

Result := '<NFe xmlns="' + ACBRNFE_NAMESPACE +'">' + Result + '</NFe>' 

Ok. Muito obrigado pela ajuda.

  • Like 1

Valdir Dill

Rio de Janeiro - RJ

 

 

Link to comment
Share on other sites

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.