Ir para conteúdo
  • Cadastre-se

dev botao

URGENTE - Erro "xmlParseEntityRef: no name" provedor DSF Sorocaba - Prestador com & na Razão Social


Ver Solução Respondido por Italo Giurizzato Junior,
  • Este tópico foi criado há 770 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado

Bom dia
Desde o dia 11/10, um único cliente que contém & na sua Razão Social no cadastro da prefeitura de Sorocaba(DSF) retorna o erro "xmlParseEntityRef: no name" ao enviar NFS e ao Consultar o Lote.

Todos os demais clientes que emitem NFS estão obtendo o retorno normalmente.

A NF é gerada e consta o lote de retorno, porém o componente dispara o erro acima e estão parados sem poder emitir notas.

Provedor: DSF
ERRO Código  : X999 Erro de Conexão: xmlParseEntityRef: no name

Correção:
---------

Agradeço a atenção

1-env-lot-sinc.xml 1-env-lot-sinc-soap.xml 1-lista-nfse-sinc-soap.xml 017122476-con-lot.xml 017122476-con-lot-soap.xml 017122476-lista-nfse-con-lot-soap.xml

Postado

UNIT   ACBrNFSeXWebserviceBase (modificada)

function TACBrNFSeXWebservice.ExtrairRetorno(const ARetorno: string;
  responseTag: array of string): string;
var
  Document: TACBrXmlDocument;
  ANode: TACBrXmlNode;
  I: Integer;
  xRetorno: string;
begin
  Result := '';

  xRetorno := TratarXmlRetornado(ARetorno);

  if xRetorno = '' then
    Exit;

  if not StringIsXML(xRetorno) then
  begin
    Result := xRetorno;
    Exit;
  end;

  if (Length(responseTag) = 0) then
  begin
    Result := xRetorno;
    Exit;
  end;

  Document := TACBrXmlDocument.Create;
  try
    xRetorno := ReplaceString( TratarXmlRetornado(ARetorno), 'R & J','R J');   // Forçando a remoção do & no nome do prestador apenas
    Document.LoadFromXml(xRetorno);   //<== Gerava erro nesse ponto

 

UNIT ACBrXmlDocument (não modifiquei)

procedure TACBrXmlDocument.LoadFromXml(AXmlDocument: string);
var
  loadedDoc: xmlDocPtr;
  loadedRoot: xmlNodePtr;
begin
  loadedDoc := xmlParseDoc(PAnsiChar(ansistring(AXmlDocument)));

A variável loadedDoc  retornava vazia sem a remoção do & na razão social

 

Na urgência tive que fazer o que não se faz...até termos a solução adequada.

Obrigado

 

  • Consultores
Postado

Boa tarde José,

Devemos evitar ao máximo alterar as units que são utilizadas por todos os provedores e sim as units destinadas aos provedores.

Na unit provider do provedor se não tiver podemos incluir a função TratarXmlRetornado, essa função tem como objetivo tratar o XML retornado pelo webservice, desta forma é possível contornar esse problema do "&" através dessa função.

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

Postado

Boa tarde Italo.

Ajustei a DSF.Provider como segue:

adicionei StrUtilsEx em USES

function TACBrNFSeXWebserviceDSF200.TratarXmlRetornado(
  const aXML: string): string;

begin
  Result := inherited TratarXmlRetornado(aXML);

  Result := ParseText(AnsiString(Result), True, False);

  Result := FaststringReplace(Result, '&#xD;&#xA;', '!#xD;!#xA;', [rfReplaceAll]);
  Result := FaststringReplace(Result, '&', ' ', [rfReplaceAll]);
  Result := FaststringReplace(Result, '!#xD;!#xA;', '&#xD;&#xA;', [rfReplaceAll]);
end;

Dessa forma substituirá todos os & por espaço, mantendo os que compõem a expressão que pula linha.

Obrigado

DSF.Provider.pas

  • Administradores
Postado

Obrigado pela contribuição, em breve será validada para possível inclusão ao svn

TK-3167

Consultora SAC ACBr

Juliana Tamizou

Gerente de Projetos ACBr / Diretora de Marketing AFRAC
Ajude o Projeto ACBr crescer - Seja Pro

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

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

  • Consultores
  • Solution
Postado

José,

Veja se a proposta abaixo não resolve o problema.

function TACBrNFSeXWebserviceDSF200.TratarXmlRetornado(
  const aXML: string): string;
begin
  Result := inherited TratarXmlRetornado(aXML);

  Result := ParseText(AnsiString(Result), True, False);
  Result := StringReplace(Result, '&', '&amp;', [rfReplaceAll]);
end;

 

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

  • Este tópico foi criado há 770 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.
Visitante
Este tópico está agora fechado para novas respostas
×
×
  • 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.