Ler arquivos XML

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
marlonpasquali
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 248
Registrado em: Sex, 06 Fev 2009 3:02 pm
Localização: ERECHIM - RS

Olá amigos,
peguei este exemplo aqui no fórum, mas não estou conseguindo executar.
Na verdade gostaria de aprender como ler um arquivo XML da NFe e gravar em uma base de dados para depois tratar as informações.

Selecionar tudo

--- primeiro criei a tabela

create table pcn_xml (nota blob)

--- depois ler o arquivo e gravar na base
declare 
AuxNomeDiretorio varchar2(100) := '/u03/oracle/HMOM2/utl_temp'; 
AuxNomeArquivo varchar2(100) := 'nota.xml'; 
AuxArquivo Bfile; 
AuxConteudo CLOB; 
AuxXML xmltype; 
begin 
-- 
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 pcn_xml(nota) values(AuxXML); 
commit; 
end; 
Temos Oracle 10g.

Está correto isto ?
se alguém puder me ajudar em um passa-a-passo...

muito obrigado,
Marlon
marlonpasquali
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 248
Registrado em: Sex, 06 Fev 2009 3:02 pm
Localização: ERECHIM - RS

Galera consegui inserir o registro, mas quando tento ler o arquivo não estou conseguindo.
Supondo o exemplo (parte) de um xml abaixo:

Selecionar tudo

<?xml version="1.0" encoding="utf-8" ?>
<nfeProc versao="1.10" xmlns="http://www.portalfiscal.inf.br/nfe">
	<NFe xmlns="http://www.portalfiscal.inf.br/nfe" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
		<infNFe Id="NFe42100786967163000163550010000011239070113520" versao="1.10">
			<ide>
				<cUF>42</cUF>
				<cNF>907011352</cNF>
				<natOp>VENDA PRODUCAO ESTABELECIMENTO</natOp>
				<indPag>1</indPag>
				<mod>55</mod>
				<serie>1</serie>
				<nNF>1123</nNF>
				<dEmi>2010-07-01</dEmi>
				<dSaiEnt>2010-07-01</dSaiEnt>
				<tpNF>1</tpNF>
				<cMunFG>4213203</cMunFG>
				<tpImp>1</tpImp>
				<tpEmis>1</tpEmis>
				<cDV>0</cDV>
				<tpAmb>1</tpAmb>
				<finNFe>1</finNFe>
				<procEmi>0</procEmi>
				<verProc>Wiser 1.6</verProc>
			</ide>

Tentei ler o numero da nota fiscal com o seguinte

Selecionar tudo

select 
extractValue (VALUE(TAB), '/ide/nNF', 'xmlns="http://www.portalfiscal.inf.br/nfe"') nronnf
from PCN_XML, TABle(XMLSequence(extract(XMLVal,'/nfeProc','xmlns="http://www.portalfiscal.inf.br/nfe'))) TAB 
where id = 2;
ai dá o erro:

ERRO na linha 3:
ORA-00904: "XMLVAL": identificador inválido


alguém pode me ajudar ?
obrigado,

Marlon
rafaelfrocha
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 45
Registrado em: Qua, 31 Out 2007 9:30 am
Localização: Uberlândia
Rafael Rocha

Amigo,

acho que sua QUERY está quase certa. Tenta aí:

Selecionar tudo

select 
extractValue (VALUE(TAB), /infNFe/ide/nNF, 'xmlns="http://www.portalfiscal.inf.br/nfe"') nronnf 
from PCN_XML, TABle(XMLSequence(extract(XMLVal, /nfeProc/NFe/infNFe','xmlns="http://www.portalfiscal.inf.br/nfe'))) TAB 
where id = 2; 
testa aí e vê se deu certo!
mauriciormaciel
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Dom, 17 Fev 2008 8:32 pm
Localização: jose bonifacio - SP

Marlon:

rodei seu script e está dizendo que o arquivo não existe, poderia me ajudar?

Selecionar tudo

create or replace procedure proc_testexml is
AuxNomeDiretorio varchar2(100) := 'C:/TEMP';
AuxNomeArquivo varchar2(100) := 'TESTE.XML';
AuxArquivo Bfile;
AuxConteudo CLOB;
AuxXML xmltype;
begin
--
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 pcn_xml(nota) values(AuxXML);
commit;
end;
frvitor
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Qua, 26 Nov 2008 10:01 am
Localização: Bragança Paulista - SP
Vitor.

Pessoal, tenho a seguinte situação.
Estou lendo arquivos XML com o extractvalue e estava tudo funcionando normal. Os arquivos que eu vinha recebendo seguiam essa padrão:

Selecionar tudo

 <?xml version="1.0" encoding="UTF-8" ?> 
 <nfeProc versao="1.10" xmlns="http://www.portalfiscal.inf.br/nfe">
   <NFe xmlns="http://www.portalfiscal.inf.br/nfe">
     <infNFe xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Id="NFe35100757422040000149550010000000130000900877" versao="1.10">
       <ide>
         <cUF>35</cUF> 
         <cNF>000090087</cNF> 
         <natOp>VENDA</natOp> 
         <indPag>1</indPag> 
         <mod>55</mod> 
         <serie>1</serie> 
         <nNF>13</nNF> 
         <dEmi>2010-07-28</dEmi> 
         <tpNF>1</tpNF> 
         <cMunFG>3552502</cMunFG> 
         <tpImp>1</tpImp> 
         <tpEmis>1</tpEmis> 
         <cDV>7</cDV> 
         <tpAmb>1</tpAmb> 
         <finNFe>1</finNFe> 
         <procEmi>3</procEmi> 
         <verProc>1.4.2</verProc> 
  </ide>
A query que uso para extrair dados desse xml é a seguinte:

Selecionar tudo

SELECT EXTRACTVALUE(T.XML_NFE,
                    '/nfeProc/NFe/infNFe/@Id',
                    'xmlns="http://www.portalfiscal.inf.br/nfe"')
  FROM NFE_XML T
Porém, recebi dias atrás um xml da seguinte forma:

Selecionar tudo

<nfeProc versao="2.00">
  <NFe xmlns="http://www.portalfiscal.inf.br/nfe">
    <infNFe xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Id="NFe35100743283811003922550010000234971001098588" versao="2.00">
      <ide>
        <cUF>35</cUF> 
        <cNF>00109858</cNF> 
        <natOp>SAIDA DE VENDA</natOp> 
        <indPag>0</indPag> 
        <mod>55</mod> 
        <serie>1</serie> 
        <nNF>23497</nNF> 
        <dEmi>2010-07-16</dEmi> 
        <tpNF>1</tpNF> 
        <cMunFG>3505708</cMunFG> 
        <tpImp>1</tpImp> 
        <tpEmis>1</tpEmis> 
        <cDV>8</cDV> 
        <tpAmb>1</tpAmb> 
        <finNFe>1</finNFe> 
        <procEmi>0</procEmi> 
        <verProc>DllZinha 1.0</verProc> 
      </ide>
Com esse novo xml a query retorna sempre null.
Aparentemente há poucas diferenças entre os dois arquivos. Algumas informações de versão na primeira linha.
Que no segundo arquivo não tem o

Selecionar tudo

<?xml version="1.0" encoding="UTF-8" ?>


e a informação

Selecionar tudo

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
, que eu desconfio ser o problema.

Tentei mudar o parâmetro de xmlns da query, ficando dessa forma:

Selecionar tudo

SELECT EXTRACTVALUE(T.XML_NFE,
                    '/nfeProc/NFe/infNFe/@Id',
                    'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"')
  FROM NFE_XML T
E também dessa forma:

Selecionar tudo

SELECT EXTRACTVALUE(T.XML_NFE,
                    '/nfeProc/NFe/infNFe/@Id',
                    'xmlns="http://www.portalfiscal.inf.br/nfe" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"')
  FROM NFE_XML T
Mas nada disso funcionou. Alguém tem idéia do que pode estar errado?
marlonpasquali
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 248
Registrado em: Sex, 06 Fev 2009 3:02 pm
Localização: ERECHIM - RS

Vitor,
tem como me enviar esse arquivo XML pro meu e-mail. Vou dar uma olhada vê se posso ajudar. Tb estou interessado.
mande por favor para marlonpasquali@gmail.com

obrigado,

Marlon
Responder
  • Informação
  • Quem está online

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