Usuário com melhor resposta
Leitura de XML

Pergunta
-
Caros amigos,
Estou tentando ler algumas informações de arquivo XML, mas o mesmo não me retorna nada, e existe informação a ser retornada.
O Codigo é o seguinte:
DECLARE @idoc int
DECLARE @doc nvarchar(1000)
SET @doc = '<nfeProc versao="1.10" xmlns="http://www.portalfiscal.inf.br/nfe">
<NFe xmlns="http://www.portalfiscal.inf.br/nfe">
<infNFe versao="1.10" Id="NFe00000000000000000000000000000000000000000000">
<ide>
<cUF>23</cUF>
<cNF>127034026</cNF>
<natOp>NFe - Homologação</natOp>
<indPag>0</indPag>
<mod>55</mod>
<serie>55</serie>
<nNF>12</nNF>
<dEmi>2009-12-21</dEmi>
<tpNF>1</tpNF>
<cMunFG>2312106</cMunFG>
<tpImp>1</tpImp>
<tpEmis>1</tpEmis>
<cDV>3</cDV>
<tpAmb>2</tpAmb>
<finNFe>1</finNFe>
<procEmi>0</procEmi>
<verProc>4.7.0.16</verProc>
</ide>
</infNFe>
</NFe>
</nfeProc>'
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
SELECT *
FROM OPENXML (@idoc, '/nfeProc/NFe/infNFe')
WITH ( cUF int '../@cUF',
natOp varchar(20) '../@natOp')
O resultado:
cUF natOp
----------- --------------------
(0 row(s) affected)
Alguem poderia me dar uma dica de onde esta o erro?- Movido Gustavo Maia Aguiar terça-feira, 5 de janeiro de 2010 15:26 (De:SQL Server - Desenvolvimento Geral)
Respostas
-
Caro Junior,
Estou utilizando o SQL 2005, inclusive peguei a base do BOL 2005. Fiz uma busca no Forum que tambem me auxilio em algumas situações, mas não especificamente nesse. Analisando a situação consegui que me trouxesse as informações com o codigo abaixo:
DECLARE @XML XML
DECLARE @idoc int
DECLARE @doc nvarchar(4000)
SELECT @XML = ' <nfeProc>
<NFe>
<infNFe versao="1.10" Id="NFe00000000000000000000000000000000000000000000">
<ide>
<cUF>23</cUF>
<cNF>127034026</cNF>
<natOp>NFe - Homologação</natOp>
<indPag>0</indPag>
<mod>55</mod>
<serie>55</serie>
<nNF>12</nNF>
<dEmi>2009-12-21</dEmi>
<tpNF>1</tpNF>
<cMunFG>2312106</cMunFG>
<tpImp>1</tpImp>
<tpEmis>1</tpEmis>
<cDV>3</cDV>
<tpAmb>2</tpAmb>
<finNFe>1</finNFe>
<procEmi>0</procEmi>
<verProc>4.7.0.16</verProc>
</ide>
</infNFe>
</NFe>
</nfeProc>'
SELECT @doc = CONVERT(VARCHAR(MAX), @XML)
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
SELECT *
FROM OPENXML (@idoc, '/')
WITH ( UF int '/nfeProc/NFe/infNFe/ide/cUF',
NF varchar(10) '/nfeProc/NFe/infNFe/ide/cNF',
NatOp varchar(50) '/nfeProc/NFe/infNFe/ide/natOp',
IndPag int '/nfeProc/NFe/infNFe/ide/indPag',
Mod int '/nfeProc/NFe/infNFe/ide/mod')
Resultado:
UF NF NatOp IndPag Mod
----------- ---------- -------------------------------------------------- ----------- -----------
23 127034026 NFe - Homologação 0 55
(1 row(s) affected)
Uma das causas:
No codigo anterior:
<nfeProc versao="1.10" xmlns="http://www.portalfiscal.inf.br/nfe">
<NFe xmlns="http://www.portalfiscal.inf.br/nfe">
Removi os elementos
versao="1.10" xmlns="http://www.portalfiscal.inf.br/nfe"
xmlns="http://www.portalfiscal.inf.br/nfe"
E me retornou os resultados esperados. O problema é que não tem como ir de arquivo em arquivo eliminar estas linhas.
Alguma dica?- Marcado como Resposta Karlos Morais quinta-feira, 31 de dezembro de 2009 11:57
-
Grande Karlos,
Sei que vc já solucionou o problema, mas.... o script abaixo tambem esta gerando o mesmo resultado...
Valeu Karlos! Abraço e Feliz Ano Novo!!! $$$$$$$
DECLARE
@idoc int
DECLARE @doc nvarchar(4000)
SET @doc = '<nfeProc versao="1.10" xmlns="http://www.portalfiscal.inf.br/nfe">
<NFe xmlns="http://www.portalfiscal.inf.br/nfe">
<infNFe versao="1.10" Id="NFe00000000000000000000000000000000000000000000">
<ide>
<cUF>23</cUF>
<cNF>127034026</cNF>
<natOp>NFe - Homologao</natOp>
<indPag>0</indPag>
<mod>55</mod>
<serie>55</serie>
<nNF>12</nNF>
<dEmi>2009-12-21</dEmi>
<tpNF>1</tpNF>
<cMunFG>2312106</cMunFG>
<tpImp>1</tpImp>
<tpEmis>1</tpEmis>
<cDV>3</cDV>
<tpAmb>2</tpAmb>
<finNFe>1</finNFe>
<procEmi>0</procEmi>
<verProc>4.7.0.16</verProc>
</ide>
</infNFe>
</NFe>
</nfeProc>'-- Retirando os XMLNS
set @Doc = Replace(@Doc, 'xmlns="http://www.portalfiscal.inf.br/nfe"', '')
-- Preparando o Documento XML
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
-- Selecionando os Dados
SELECT * -- OU (***) SELECT * into #TesteXML
FROM OPENXML (@idoc, '/nfeProc/NFe/infNFe/ide', 2)
WITH (cUF int, cNF int, natOp varchar(50), indPag int, mod int, serie int, nNF int,
dEmi smalldatetime, tpNF int, cMunFG int, tpImp int, tpEmis int, cDV int, tpAmb int,
finNFe int, procEmi int, verProc varchar(15))
Exec sp_xml_removedocument @idoc-- Caso utilizar o OU (***)
-- Select * from #TesteXML
-- drop table #TesteXML
Alex- Marcado como Resposta Gustavo Maia Aguiar terça-feira, 5 de janeiro de 2010 00:22
Todas as Respostas
-
Karlos,
Aparentemente você esta utilizando SQL Server 2000!!!
Esta maneira que você esta tentando fazer a leitura, já foi muito discutida aqui no fórum, realize uma pesquisa.
Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA -
Caro Junior,
Estou utilizando o SQL 2005, inclusive peguei a base do BOL 2005. Fiz uma busca no Forum que tambem me auxilio em algumas situações, mas não especificamente nesse. Analisando a situação consegui que me trouxesse as informações com o codigo abaixo:
DECLARE @XML XML
DECLARE @idoc int
DECLARE @doc nvarchar(4000)
SELECT @XML = ' <nfeProc>
<NFe>
<infNFe versao="1.10" Id="NFe00000000000000000000000000000000000000000000">
<ide>
<cUF>23</cUF>
<cNF>127034026</cNF>
<natOp>NFe - Homologação</natOp>
<indPag>0</indPag>
<mod>55</mod>
<serie>55</serie>
<nNF>12</nNF>
<dEmi>2009-12-21</dEmi>
<tpNF>1</tpNF>
<cMunFG>2312106</cMunFG>
<tpImp>1</tpImp>
<tpEmis>1</tpEmis>
<cDV>3</cDV>
<tpAmb>2</tpAmb>
<finNFe>1</finNFe>
<procEmi>0</procEmi>
<verProc>4.7.0.16</verProc>
</ide>
</infNFe>
</NFe>
</nfeProc>'
SELECT @doc = CONVERT(VARCHAR(MAX), @XML)
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
SELECT *
FROM OPENXML (@idoc, '/')
WITH ( UF int '/nfeProc/NFe/infNFe/ide/cUF',
NF varchar(10) '/nfeProc/NFe/infNFe/ide/cNF',
NatOp varchar(50) '/nfeProc/NFe/infNFe/ide/natOp',
IndPag int '/nfeProc/NFe/infNFe/ide/indPag',
Mod int '/nfeProc/NFe/infNFe/ide/mod')
Resultado:
UF NF NatOp IndPag Mod
----------- ---------- -------------------------------------------------- ----------- -----------
23 127034026 NFe - Homologação 0 55
(1 row(s) affected)
Uma das causas:
No codigo anterior:
<nfeProc versao="1.10" xmlns="http://www.portalfiscal.inf.br/nfe">
<NFe xmlns="http://www.portalfiscal.inf.br/nfe">
Removi os elementos
versao="1.10" xmlns="http://www.portalfiscal.inf.br/nfe"
xmlns="http://www.portalfiscal.inf.br/nfe"
E me retornou os resultados esperados. O problema é que não tem como ir de arquivo em arquivo eliminar estas linhas.
Alguma dica?- Marcado como Resposta Karlos Morais quinta-feira, 31 de dezembro de 2009 11:57
-
-
Grande Karlos,
Sei que vc já solucionou o problema, mas.... o script abaixo tambem esta gerando o mesmo resultado...
Valeu Karlos! Abraço e Feliz Ano Novo!!! $$$$$$$
DECLARE
@idoc int
DECLARE @doc nvarchar(4000)
SET @doc = '<nfeProc versao="1.10" xmlns="http://www.portalfiscal.inf.br/nfe">
<NFe xmlns="http://www.portalfiscal.inf.br/nfe">
<infNFe versao="1.10" Id="NFe00000000000000000000000000000000000000000000">
<ide>
<cUF>23</cUF>
<cNF>127034026</cNF>
<natOp>NFe - Homologao</natOp>
<indPag>0</indPag>
<mod>55</mod>
<serie>55</serie>
<nNF>12</nNF>
<dEmi>2009-12-21</dEmi>
<tpNF>1</tpNF>
<cMunFG>2312106</cMunFG>
<tpImp>1</tpImp>
<tpEmis>1</tpEmis>
<cDV>3</cDV>
<tpAmb>2</tpAmb>
<finNFe>1</finNFe>
<procEmi>0</procEmi>
<verProc>4.7.0.16</verProc>
</ide>
</infNFe>
</NFe>
</nfeProc>'-- Retirando os XMLNS
set @Doc = Replace(@Doc, 'xmlns="http://www.portalfiscal.inf.br/nfe"', '')
-- Preparando o Documento XML
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
-- Selecionando os Dados
SELECT * -- OU (***) SELECT * into #TesteXML
FROM OPENXML (@idoc, '/nfeProc/NFe/infNFe/ide', 2)
WITH (cUF int, cNF int, natOp varchar(50), indPag int, mod int, serie int, nNF int,
dEmi smalldatetime, tpNF int, cMunFG int, tpImp int, tpEmis int, cDV int, tpAmb int,
finNFe int, procEmi int, verProc varchar(15))
Exec sp_xml_removedocument @idoc-- Caso utilizar o OU (***)
-- Select * from #TesteXML
-- drop table #TesteXML
Alex- Marcado como Resposta Gustavo Maia Aguiar terça-feira, 5 de janeiro de 2010 00:22
-
Boa Noite,
Sugiro optar pelo método Nodes ao invés do OPENXML. Normalmente ele é menos performático e sujeito a problemas.
[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.spaces.live.comA Impedância, o Mapeamento Objeto Relacional e Implementações – Parte III
http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!899.entry
Classifique as respostas. O seu feedback é imprescindível