none
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?
    quarta-feira, 30 de dezembro de 2009 19:59

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
    quinta-feira, 31 de dezembro de 2009 11:50
  • 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
    quinta-feira, 31 de dezembro de 2009 12:32

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
    quinta-feira, 31 de dezembro de 2009 03:27
  • 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
    quinta-feira, 31 de dezembro de 2009 11:50
  • Junior,

    Cheuguei a uma solução. Utilizei Replace para eliminar os elements ja que eles são fixos. Mesmo assim obrigado pela força.

    Abraço,
    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
    quinta-feira, 31 de dezembro de 2009 12:32
  • 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.com

    A 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
    terça-feira, 5 de janeiro de 2010 00:24
    Moderador