NFe - Importar arquivo XML do fornecedor

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
Msfabris
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 30
Registrado em: Qua, 17 Fev 2010 8:02 am
Localização: Criciuma SC

Bom dia

Estou a procura de uma forma de importar o arquivo XML de uma NFe de um fornecedor para o banco de dados. já procurei no forum, tentei varios exemplos mas ainda não tive sucesso.

Estou com problema ao registrar o schema com o arquivo XSD que tenho.

Para isto estou utilizando o comando:

Selecionar tudo

 
begin    dbms_xmlschema.registerSchema('xmlns="http://www.portalfiscal.inf.br/nfe"',
                                  bfilename('XML_DIR','leiauteNFe_v1.10.xsd'),
                                  TRUE, TRUE, FALSE, FALSE );
end; 
Tenho a seguinte mensagem de erro:

Selecionar tudo

ORA-31011: XML parsing failed
ORA-19202: Error occurred in XML processing
LPX-00216: invalid character 128 (0x80)
Error at line 55
ORA-06512: at "XDB.DBMS_XMLSCHEMA_INT", line 0
ORA-06512: at "XDB.DBMS_XMLSCHEMA", line 26
ORA-06512: at "XDB.DBMS_XMLSCHEMA", line 131
ORA-06512: at line 2

O documento é muito grande, vou postar o início.

Selecionar tudo

 <?xml version="1.0" encoding="UTF-8"?>
<!--  versao com alteracoes do tipo token, valida a partir de 03/11/08- PL_005b-->
<!--  versao com atualizacao na UFCons e cPais emi - 21/12/08 - PL_005c-->
<!--  versao com atualizacao no CFOP/Inscricao SUFRAMA/ID infNFe - 11/08/09 - PL_005d-->
<xs:schema xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.portalfiscal.inf.br/nfe" targetNamespace="http://www.portalfiscal.inf.br/nfe" elementFormDefault="qualified" attributeFormDefault="unqualified">
	<xs:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="xmldsig-core-schema_v1.01.xsd"/>
	<xs:include schemaLocation="tiposBasico_v1.02.xsd"/>
	<xs:complexType name="TNFe">
		<xs:annotation>
			<xs:documentation>Tipo Nota Fiscal Eletrônica</xs:documentation>
		</xs:annotation>
		<xs:sequence>
			<xs:element name="infNFe">
				<xs:annotation>
					<xs:documentation>Informações da Nota Fiscal eletrônica</xs:documentation>
				</xs:annotation>
				<xs:complexType>
					<xs:sequence> 
Se necessário posso colocar o resto.



alguém já fez isto?
Estou fazendo da forma correta?
É necessário registrar o schema para ler um xml?
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

O character set do documento XML precisa ser um subconjunto do character set do seu banco de dados.

Seu XML usa character set UTF-8, que provavelmente não é suportado pelo character set atual do seu banco de dados.

Verifique o seguinte:

Selecionar tudo

select sys_context('USERENV', 'LANGUAGE') from dual;
Depois do nome do idioma, após o ponto ('.') vem o character set.
Msfabris
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 30
Registrado em: Qua, 17 Fev 2010 8:02 am
Localização: Criciuma SC

Exatamente fsitja, está definido outro charset (WE8ISO8859P1).
Sendo assim, fiz uma alteração no XSD retirando todos caracteres especiais.

E então o obtive outro erro:

Selecionar tudo

ORA-31000: Recurso "xmldsig-core-schema.xsd" não é um documento de esquema XDB
ou em inglês

Selecionar tudo

ORA-31000: Resource 'xmldsig-core-schema.xsd' is not an XDB schema document
Dentro do XSD existe uma linha importando outro esquema

Selecionar tudo

 <xs:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="xmldsig-core-schema_v1.01.xsd"/> 
Tenho que registrar este outro XSD antes?
Na verdade já tentei, mas da erro

Selecionar tudo

LPX-00280: HTTP error 400 Bad Request

E agora?
alguém já importou XML de uma NFe para o BD, é necessário registrar o esquema?


Obrigado
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Necessário não é, mas é mais cômodo e seguro pois é feita a validação do formato do XML contra a definição do schema.

Sem registro do schema você vai apenas utilizar a validação padrão para XML, que basicamente verifica se o documento é um XML bem-definido.
http://en.wikipedia.org/wiki/XML#Well-f ... r-handling

Dá para carregar os dados direto sem registrar usando XMLType e XMLTable para jogar num modelo relacional, com o inconveniente que o XML não vai validar automaticamente tipagem de dados e as tags dos campos, entre outras coisas.

Você já está armazenando os documentos XML em blob ou clob, né? Dá uma olhada nos docs abaixo, tem alguns exemplos:
http://download.oracle.com/docs/cd/E118 ... b05sto.htm

Se tiver dificuldade nas queries posta um exemplo de XML de dados e a tabela para inserir e tentamos resolver.

A parte do registro do schema vale a pena pesquisar melhor, pois é mais seguro, mas aqui não tenho como testar esse erro aqui e reproduzir. De qualquer forma a carga dos dados fica igual depois.
Msfabris
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 30
Registrado em: Qua, 17 Fev 2010 8:02 am
Localização: Criciuma SC

Parece que o problema esta com a XSD fornecida pelo governo. Fiz o teste com uma XSD de exemplo da oracle (um pouco mais simples) e funcionou tudo como deveria.


Agora a pergunta...alguém já fez a leitura do xml com schema registrado da NFe?

Minha versão do banco é a 9.2.0.8



Obrigado
Marcel
Msfabris
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 30
Registrado em: Qua, 17 Fev 2010 8:02 am
Localização: Criciuma SC

Meu caso progrediu.. já registrei os esquemas da NFe...
mas agora está dando erro com o element, na hora de criar a tabela.

Selecionar tudo

ORA-31043: Element 'infNFe' not globally defined in schema 'http://www.portalfiscal.inf.br/nfe/leiauteNFe_v1.10.xsd'
Msfabris
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 30
Registrado em: Qua, 17 Fev 2010 8:02 am
Localização: Criciuma SC

Bom dia

Consegui fazer funcionar....
Tive que adicionar uma linha no xsd com um elemento do tipo NFeProc

Selecionar tudo

<xs:element name="nfeProc" type="TNfeProc"/>


Obrigado
Marcel
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Blza? A query para ler os dados está tranquila também?
Msfabris
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 30
Registrado em: Qua, 17 Fev 2010 8:02 am
Localização: Criciuma SC

Sim, ficou jóia.


Mas quando fui aplicar isto em uma base 9.2.0.5 que tenho, não funcionou... Da ORA 19007 quando tento inserir um xml na tabela. To desconfiando que a versão do Xml (catqm.sql) que instalei nessa base 9.2.0.5 não corresponde a esta versão.

Vou baixar a instalação da base para pegar estes arquivos.


Valeu fsitja.
Realmente é insteressante utilizar um xmlSchema, pois com isso encontramos alguns arquivos xml que recebemos que não estavam com a estrutura correta. Alem de garantir que tudo estara com a mesma estrutura, facilitando nos selects.


Marcel S Fabris
Marlom
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Ter, 20 Out 2009 12:47 pm
Localização: Blumenau - Santa Catarina

Bom Dia!

Tenta utilizar estas duas rotinas a primeira é para importar e a segunda é para ler as informações....utilizo as duas já faz uns 6 meses e nunca derão problema... a única coisa que deve ser observada é que o código pode necessitar de tratamentos específicos de acordo com os arquivo que cada fornecedor manda.

Gravar Xml na base:

Selecionar tudo

declare
  AuxNomeDiretorio varchar2(100) := '<Nome Do Diretório no Banco de Dados>';
  AuxNomeArquivo varchar2(100) := '<Nome Do Arquivo>.xml';
  AuxArquivo Bfile;
  AuxConteudo CLOB;
  AuxXML xmltype;
begin
--  create or replace directory MsvSimXml as AuxNomeDiretorio;
--
  AUXArquivo  := bfilename(AuxNomeDiretorio,AuxNomeArquivo);
--
  DBMS_LOB.fileOpen(AUXArquivo,dbms_lob.file_readonly);
--
  DBMS_LOB.createtemporary(AuxConteudo,TRUE,DBMS_LOB.session);
--
  DBMS_LOB.loadFromFile(AuxConteudo,AuxArquivo,DBMS_LOB.getLength(AuxArquivo),1,1);
--
  DBMS_LOB.fileClose(AuxArquivo);
--
  AuxXML := XMLType.createxml(AuxConteudo);
--
  Insert Into <TABELA>(<COLUNA XMLTYPE>) values(AuxXML);
  commit;
end;
Ler XML:

Selecionar tudo

SELECT Extract(<COLUNA XMLTYPE),'<TAG do arquivo da nota fiscal desde o primeiro nó EX:> nfeProc/NFe/infNFe/ide','xmlns="http://www.portalfiscal.inf.br/nfe"').Getstringval() "ide"
  FROM   <TABELA>;
Abraços e espero que ajude tanto quanto esta me ajudando....
Msfabris
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 30
Registrado em: Qua, 17 Fev 2010 8:02 am
Localização: Criciuma SC

Olá Marlon.


Tentei importar com seu script na base 9.2.0.5, mas continua dando o erro...
ORA-19007: Schema and element do not match
ORA-06512: at line 22

Realizando os mesmos passos (e mesmos arquivos) em uma base 9.2.0.8 funciona perfeitamente.


Obrigado!

---
Marcel
daniella
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Sex, 19 Nov 2010 1:23 am
Localização: RJ

Bom dia Msfabris !!

Estou com o mesmo problema que o Msfabris teve e resolveu com o erro ORA-31000: Resource 'xmldsig-core-schema_v1.01.xsd' is not an XDB schema document
em:

Selecionar tudo

<xs:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="xmldsig-core-schema_v1.01.xsd"/> 
Por favor, como você resolveu ?
Msfabris
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 30
Registrado em: Qua, 17 Fev 2010 8:02 am
Localização: Criciuma SC

daniella, você precisa registrar o schema

Selecionar tudo

xmldsig-core-schema_v1.01.xsd

  DBMS_XMLSCHEMA.registerSchema(
    SCHEMAURL => 'tiposBasico_v1.02.xsd',
    SCHEMADOC => bfilename('XML_DIR','tiposBasico_v1.02.xsd'),
daniella
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Sex, 19 Nov 2010 1:23 am
Localização: RJ

Msfabris,

o que eu coloco no xml_dir ? Estou no windows como cliente. O banco está num serivdor linux.
Para gerar a nfe eu tinha copiado todo o texto ao invés de referenciar do arquivo.
Eu usei o comando

Selecionar tudo

create or replace directory XMLDIR as "c:\"; 
e também não funcionou.

Eu tirei toda a acentuação porque estava me dando erro, assim como você teve. Tem usar o arquivo sem retirar a acentuação ?
Msfabris
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 30
Registrado em: Qua, 17 Fev 2010 8:02 am
Localização: Criciuma SC

daniella, o xml_dir é um directory que criei no banco (como você tentou criar). Ele é um sinonimo para um caminho de onde está o diretorio no servidor (ex: /usr/tmp/nfe)

O arquivo xml precisa estar em um diretorio que o banco consiga acessar, verifique nos parametros do banco o utl_file_dir.


Sobre a acentuação, não sei te responder pois não chegamos a implantar esta funcionalidade de xml no sistema. Ficou só na pesquisa.
daniella
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Sex, 19 Nov 2010 1:23 am
Localização: RJ

Msfabris, então eu tenho que criar o diretório no servidor do banco e não no cliente (windows) ? Para testar estava tentando não envolver dba por enquanto.
Msfabris
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 30
Registrado em: Qua, 17 Fev 2010 8:02 am
Localização: Criciuma SC

Exato. Você terá que envolver o DBA e o administrador de redes.

Cria um diretório no servidor
Faz o compartilhamento dele com a rede (Samba)
Mapeia o compartilhamento como uma unidade de rede no windows.
daniella
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Sex, 19 Nov 2010 1:23 am
Localização: RJ

Obrigada Msfabris.

Mais uma dúvida.

Quando gero o xml através do select com xMLElemnt, XMLAttributes, o resultado fica em uma única tupla por linha. As tags ficam todas uma após as outras na mesma linha. Como faço para ficar identado em diversas linhas ?
Eu utilizo tanto o toad como o sqldeveloper, banco oracle 9.
daniella
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Sex, 19 Nov 2010 1:23 am
Localização: RJ

Quero dizer, o xml referenta a uma tupla da tabela fica toda em uma linha, com as tags lado a lado.
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Você pode forçar o retorno com "pretty print" usando o SQL abaixo:

Selecionar tudo

select t.coluna_xml.extract('/*') from sua_tabela t;
daniella
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Sex, 19 Nov 2010 1:23 am
Localização: RJ

Eu tenho que gravar este coluna em uma tabela como varchar2.
Eu consigo fazer isto de que maneira com xml.extract ?

obrigada, Fsitja
daniella
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Sex, 19 Nov 2010 1:23 am
Localização: RJ

Quero dizer, o xml referenta a uma tupla da tabela fica toda em uma linha, com as tags lado a lado.
daniella
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Sex, 19 Nov 2010 1:23 am
Localização: RJ

Obrigada. Funcionou.
Mas como eu faço agora para gravar este xml (com o formato xml gerado) em uma coluna varchar2.
Não estou conseguindo.
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

A coluna xmltype é CLOB, e pode ultrapassar facilmente os 4000 caracteres do limite do varchar2... mas você pode usar SUBSTR(coluna_do_xml, 1, 4000) no insert ou update para um varchar2.
daniella
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Sex, 19 Nov 2010 1:23 am
Localização: RJ

Obrigada. Funcionou
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 4 visitantes