Ir para conteúdo
  • Cadastre-se

dev botao

Erro na validação de um XSD...


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

Recommended Posts

Configurei o ACBrNFSe_Exemplo para emitir NFSe no provedor DSF (em particular a prefeitura de Uberlândia), no início os testes foram OK, mas quando consegui começar a emitir lotes de teste começou a aparecer um problema na validação de um XSD.

A mensagem de erro que aparece é essa:

image.png.a63024ec6ab8dc8e3c42a0d4b81f66e2.png

Comecei a depurar e cheguei na unit ACBrDFeXsMsXml, mais precisamente na função TDFeSSLXmlSignMsXml.Validar:

function TDFeSSLXmlSignMsXml.Validar(const ConteudoXML, ArqSchema: String; out MsgErro: String): Boolean;
var
  DOMDocument: IXMLDOMDocument2;
  ParseError: IXMLDOMParseError;
  Schema: XMLSchemaCache50;
  AXml: String;
  ResultInitialize: HRESULT;
  Inicializado: Boolean;
begin
  Result := False;
  ResultInitialize := CoInitialize(nil);
  if (ResultInitialize = E_FAIL) then
    raise EACBrDFeException.Create('Erro ao inicializar biblioteca COM');

  Inicializado := (ResultInitialize in [ S_OK, S_FALSE ]);
  try
    DOMDocument := CoDOMDocument50.Create;
    Schema := CoXMLSchemaCache50.Create;
    try
      DOMDocument.async := False;
      DOMDocument.resolveExternals := False;
      DOMDocument.validateOnParse := True;

      // Carregando ConteudoXML em XMLDOC. Nota: IXMLDOMDocument2 deve usar a String Nativa da IDE //
      {$IfDef FPC2}
       AXml := ACBrUTF8ToAnsi(ConteudoXML);
      {$Else}
       AXml := UTF8ToNativeString(ConteudoXML);
      {$EndIf}

      if (not DOMDocument.loadXML(WideString(AXml))) then
      begin
        ParseError := DOMDocument.parseError;
        MsgErro := ACBrStr('Não foi possível carregar o arquivo.')+sLineBreak+
                   'Err: '+IntToStr(ParseError.errorCode) + ', ' +
                   'Lin: '+IntToStr(ParseError.line) + ', ' +
                   'Pos: '+IntToStr(ParseError.linepos) + ' - ' +
                   String(ParseError.reason);
        exit;
      end;

      Schema.add(WideString(FpDFeSSL.NameSpaceURI), ArqSchema); <<<--- CHAMADA QUE GERA A EXCEÇÃO

      DOMDocument.schemas := Schema;
      ParseError := DOMDocument.validate;

      Result := (ParseError.errorCode = 0);
      MsgErro := String(ParseError.reason);
    finally
      ParseError := nil;
      DOMDocument := nil;
      Schema := nil;
    end;
  finally
    if Inicializado then
      CoUninitialize;
  end;
end;

No momento em que o depurador passa a linha "Schema.add(WideString(FpDFeSSL.NameSpaceURI), ArqSchema);" o delphi lança uma  "excepiton".

O valor das variáveis são os seguintes:

FpDFeSSL.NameSpaceURI := 'http://localhost:8080/WsNFe2/lote'

ArqSchema := 'D:\Install\Componentes\ACBr\Exemplos\ACBrDFe\ACBrNFSe\Delphi\ReqEnvioLoteRPS.xsd'

O conteúdo de ReqEnvioLoteRPS.xsd é:

<xs:schema xmlns:tipos="http://localhost:8080/WsNFe2/tp"
	xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
	xmlns:ns1="http://localhost:8080/WsNFe2/lote" targetNamespace="http://localhost:8080/WsNFe2/lote">
	<xs:import namespace="http://localhost:8080/WsNFe2/tp"
		schemaLocation="Tipos.xsd" />
	<xs:import namespace="http://www.w3.org/2000/09/xmldsig#"
		schemaLocation="xmldsig-core-schema_v1.01.xsd" />
	<xs:element name="ReqEnvioLoteRPS">
		<xs:annotation>
			<xs:documentation>Schema utilizado para envio de lote de RPS.</xs:documentation>
			<xs:documentation>Este Schema XML é utilizado pelos prestadores
				de serviços para substituição em lote de RPS por NFS-e.
			</xs:documentation>
		</xs:annotation>
		<xs:complexType>
			<xs:sequence>
				<xs:element name="Cabecalho">
					<xs:annotation>
						<xs:documentation>Cabeçalho do Lote.</xs:documentation>
					</xs:annotation>
					<xs:complexType>
						<xs:sequence>
							<xs:element name="CodCidade" type="tipos:tpCodCidade" minOccurs="1" maxOccurs="1">
								<xs:annotation>
									<xs:documentation>Informe o Codigo da Cidade no Padrão SIAFI.
									</xs:documentation>
								</xs:annotation>
							</xs:element>
							<xs:element name="CPFCNPJRemetente" type="tipos:tpCPFCNPJ" minOccurs="1" maxOccurs="1">
								<xs:annotation>
									<xs:documentation>
										CNPJ do contribuinte ou CPF do Responsável Legal autorizado a entregar o lote.
									</xs:documentation>
								</xs:annotation>
							</xs:element>
							<xs:element name="RazaoSocialRemetente" type="tipos:tpRazaoSocial" minOccurs="1" maxOccurs="1">
								<xs:annotation>
									<xs:documentation>
										Informe o Nome do Contribuinte ou do Responsável Legal
									</xs:documentation>
								</xs:annotation>
							</xs:element>
							<xs:element name="transacao" type="xs:boolean"
								default="true" minOccurs="1" maxOccurs="1">
								<xs:annotation>
									<xs:documentation>
										Informe se os RPS a serem
										substituídos por
										NF-e farão
										parte de uma mesma transação.
										True - Os RPS só serão
										substituídos por NF-e se não
										ocorrer nenhum evento de erro
										durante o processamento de todo
										o lote; False - Os RPS válidos
										serão substituídos por NF-e,
										mesmo que ocorram eventos de
										erro durante processamento de
										outros RPS deste lote. Por definição
										estão sendo aceitos apenas lotes com RPS válidos,
										o lote é
										recusado caso haja algum RPS inválido.
									</xs:documentation>
								</xs:annotation>
							</xs:element>
							<xs:element name="dtInicio" type="xs:date" minOccurs="1" maxOccurs="1">
								<xs:annotation>
									<xs:documentation>
										Informe a data de início do
										período
										transmitido
										(AAAA-MM-DD).
									</xs:documentation>
								</xs:annotation>
							</xs:element>
							<xs:element name="dtFim" type="xs:date" minOccurs="1" maxOccurs="1">
								<xs:annotation>
									<xs:documentation>
										Informe a data final do período
										transmitido
										(AAAA-MM-DD).
									</xs:documentation>
								</xs:annotation>
							</xs:element>
							<xs:element name="QtdRPS" type="tipos:tpQtdRpsLote" minOccurs="1" maxOccurs="1">
								<xs:annotation>
									<xs:documentation>
										Informe o total de RPS contidos
										na mensagem
										XML. OBS: O xml não pode ultrapassar o tamanho maximo de 500kb.
									</xs:documentation>
								</xs:annotation>
							</xs:element>
							<xs:element name="ValorTotalServicos" type="tipos:tpValor" minOccurs="1" maxOccurs="1">
								<xs:annotation>
									<xs:documentation>
										Informe o valor total dos
										serviços prestados
										dos RPS
										contidos na mensagem XML.
									</xs:documentation>
								</xs:annotation>
							</xs:element>
							<xs:element name="ValorTotalDeducoes" type="tipos:tpValor" minOccurs="1" maxOccurs="1">
								<xs:annotation>
									<xs:documentation>
										Informe o valor total das
										deduções dos RPS
										contidos na
										mensagem XML.
									</xs:documentation>
								</xs:annotation>
							</xs:element>
							<xs:element name="Versao" type="tipos:tpVersao" fixed="1" minOccurs="1" maxOccurs="1">
								<xs:annotation>
									<xs:documentation>
										Informe a Versão do Schema XML
										utilizado.
									</xs:documentation>
								</xs:annotation>
							</xs:element>
							<xs:element name="MetodoEnvio" type="tipos:tpMetodoEnvio"
								minOccurs="1" maxOccurs="1">
								<xs:annotation>
									<xs:documentation>Informe o Método de Envio</xs:documentation>
								</xs:annotation>
							</xs:element>
							<xs:element name="VersaoComponente" type="tipos:tpVersaoComponente"
								minOccurs="0" maxOccurs="1">
								<xs:annotation>
									<xs:documentation>Versão da DLL de envio de lote. Não é necessário informar esse campo caso não utilize a DLL.
									</xs:documentation>
								</xs:annotation>
							</xs:element>

						</xs:sequence>
					</xs:complexType>
				</xs:element>
				<xs:element name="Lote" type="tipos:tpLote" minOccurs="1" maxOccurs="1">
					<xs:annotation>
						<xs:documentation>Informe os RPS a serem substituidos por
							NF-e.</xs:documentation>
					</xs:annotation>
				</xs:element>
				<xs:element ref="ds:Signature" minOccurs="0" maxOccurs="1" />
			</xs:sequence>
		</xs:complexType>
	</xs:element>
</xs:schema>

A exceção é gerada devido ao sistema encontrar um tipo não declarado, mas pelo que eu vejo no XSD me parece correto. O que pode estar acontecendo?

Descobrimos o problema, no diretório raiz do exemplo faltou dois XSD que estavam em um subdiretório, e isso gerou o erro. Corrigimos colocando todos no mesmo diretório raiz do exemplo.

Vlw galera!

Link para o comentário
Compartilhar em outros sites

  • Administradores

Obrigado por reportar.

Fechando. Para novas dúvidas, criar um novo tópico.

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 !!

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 1366 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.