Ir para conteúdo
  • Cadastre-se

  • Este tópico foi criado há 187 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado

Boa tarde!

Gostaria de fazer uma contribuição referente a mensagem de erro que a LibXml2 retorna ao identificar uma tag com valor incorreto (maior que o permitido, menor que o permitido, etc.).

Atualmente, a mensagem está assim:

--> 1831 - Element '{http://www.portalfiscal.inf.br/nfe}xBairro': [facet 'minLength'] The value has a length of '1'; this underruns the allowed minimum length of '2'.

Dependendo da tag, ela se repete várias vezes no XML e demoramos mais para identificar onde ela realmente está na estrutura. Então quis colocar o caminho completo da estrutura do XML até chegar na tag problemática, para ficar assim:

--> 1831 - Element '{http://www.portalfiscal.inf.br/nfe}/NFe/infNFe/dest/enderDest/xBairro': [facet 'minLength'] The value has a length of '1'; this underruns the allowed minimum length of '2'.

Procurei nos fontes e não encontrei nada que ativasse esse comportamento. Por isso criei um método que devolve o caminho completo do nodo raiz até a tag. 

Na ACBrLibXml2.pas, o novo método:

function xmlGetNodePathNoNS(Node: xmlNodePtr): string;
var s: String;
begin
  Result := '';
  while Assigned(Node) do
  begin
    // xmlNode.name é um PAnsiChar, converte para string Delphi
    s := Trim(string(Node^.name));
    if s <> '' then
       Result := '/' + s + Result;
    Node := Node^.parent;
  end;
end;

E na ACBrDFeXsLibXml2.pas, alterei a parte que atribui a mensagem de erro ao Result na TentaPegarMensagemErroDetalhada. A ideia é substituir o "xBairrro" pelo retorno da função xmlGetNodePathNoNS.

function TDFeSSLXmlSignLibXml2.TentaPegarMensagemErroDetalhada(const MsgErroAtual: string): String;
var
  prtUltimoErroXml: xmlErrorPtr;
begin
  Result := '';
  prtUltimoErroXml := xmlGetLastError();
  if prtUltimoErroXml = nil then
  begin
    Result := MsgErroAtual;
    Exit;
  end;

  Result := MsgErroAtual + ' --> ' + IntToStr(prtUltimoErroXml^.code);

  if (prtUltimoErroXml^.message <> nil) then
     //Result := Result + ' - ' + prtUltimoErroXml^.message; //Era assim
     Result := Result + ' - ' + StringReplace(prtUltimoErroXml^.message, xmlNodePtr(prtUltimoErroXml^.node)^.name,
                                              xmlGetNodePathNoNS(prtUltimoErroXml^.node), [rfIgnoreCase]); //Ficou assim

end;

Estou a disposição para discutir se essa seria a melhor maneira de fazer isso.

Postado

Oi Daniel.

Claro. Seguem em anexo.

Estava revisando as units antes de enviar aqui e também percebi que existe outra alteração que fiz. Essa foi há mais tempo, mas esqueci de enviar para cá.

Na ACBrDFeXsLibXml2.LibXmlNodeWasFound estava fazendo a comparação:

Citar

ANode^.Name = NodeName

Um de nossos clientes recebeu um XML de CT-e que tinha a tag "infCte", sendo que o padrão seria "infCTe". E por conta do "T" minúsculo, o nó não foi encontrado. Então comecei a fazer a comparação com o AnsiSameText do Delphi.

Não está relacionado ao assunto do tópico, mas como vocês iriam perceber essa mudança no Diff, achei melhor explicar o motivo.

ACBrLibXml2.pas ACBrDFeXsLibXml2.pas

  • Curtir 1
  • Fundadores
Postado
1 hora atrás, Fernando Schuch disse:

Um de nossos clientes recebeu um XML de CT-e que tinha a tag "infCte", sendo que o padrão seria "infCTe". E por conta do "T" minúsculo, o nó não foi encontrado. Então comecei a fazer a comparação com o AnsiSameText do Delphi.

acho que também ajudaria bastante... mas precisamos saber se D7 e Lazarus suportam

@EMBarbosa, me ajuda no Merge dessa analise e contribuição ?

Muito obrigado @Fernando Schuch

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

  • Consultores
Postado
1 hora atrás, Daniel Simoes disse:

acho que também ajudaria bastante... mas precisamos saber se D7 e Lazarus suportam

@EMBarbosa, me ajuda no Merge dessa analise e contribuição ?

Muito obrigado @Fernando Schuch

Claro. 

Criei um chamado no nosso backlog, a saber, ACBR-8545.

@Fernando Schuch, Muito obrigado pela contribuição.

Assim que possível te dou um retorno aqui mesmo.

  • Curtir 1

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
  • Este tópico foi criado há 187 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.