none
Dúvida Usando XML Source! RRS feed

  • Pergunta

  • Eu tenho o seguinte XML:

    <?xml version="1.0" encoding="ISO-8859-1" ?>
    <DADOS>
        <NUM_RMA>1234</NUM_RMA>
        <NUM_NF>055888</NUM_NF>
        <DATA_RECEBIMENTO>25/02/2009</DATA_RECEBIMENTO>
        <ITEM>
            <IMEI>111111111111</IMEI>
            <PART_NUMBER>XPTO123</PART_NUMBER>
            <COD_DEF_RECL>AC12</COD_DEF_RECL>
        </ITEM>
        <ITEM>
            <IMEI>222222222222</IMEI>
            <PART_NUMBER>XPTO123</PART_NUMBER>
            <COD_DEF_RECL>XR56</COD_DEF_RECL>
        </ITEM>
        <ITEM>
            <IMEI>333333333333</IMEI>
            <PART_NUMBER>XPTO999</PART_NUMBER>
            <COD_DEF_RECL>AC12</COD_DEF_RECL>
        </ITEM>
    </DADOS>

    Eu consigo fazer leitura dos dados que estão dentro de <ITEM> usando um Script Component e o comando valor = Row.IMEI.ToString()


    Porém eu gostaria de ler o valor que está fora de item.
    No caso os valores de:
      <NUM_RMA>1234</NUM_RMA>
      <NUM_NF>055888</NUM_NF>
      <DATA_RECEBIMENTO>25/02/2009</DATA_RECEBIMENTO>

    Qual comando que me permite fazer isso?

    Obrigado,

    Cassiano
    quarta-feira, 20 de maio de 2009 15:32

Respostas

  • Dei uma pesquisada no MSDN gringo e achei a resposta.
    ______________________________________________________

    The SSIS Xml Source component ignores the root xml element by design. 

     

    So, to recognize that otherwise ignored root element as a output, one would need to wrap that root element with yet another "root" element, such as the below "<wrapper/>" element, probably via an XSL transform in a Xml control flow task.

     

    <wrapper>

    <root client="2325" date="020608">

         <name>toto</name>

         <job>cont</job>

    </root>

    </wrapper>


    ______________________________________________________


    http://social.msdn.microsoft.com/Forums/en-US/sqlintegrationservices/thread/c990397f-1c16-4160-acc9-3a4d8961f4a5/


    Usei o seguinte xsl e deixei o xml do jeito que eu tinha comentado que carregaria o xml

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:template match="/">
     <ITEMS>
            <xsl:apply-templates/>
     </ITEMS>
      </xsl:template>
      <xsl:template match="node()|@*">
        <xsl:copy>
          <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
      </xsl:template>
    </xsl:stylesheet>
    

    Isso fez com que eu tenha 2 tabelas.


    Fica aí a dica para quem encontrar o mesmo problema.


    att,

    Cassiano

    • Marcado como Resposta Cassiano Sanches segunda-feira, 25 de maio de 2009 11:34
    segunda-feira, 25 de maio de 2009 11:34

Todas as Respostas

  • Boa Tarde,

    Há alternativas mas pensemos um pouco mais amplo.
    Qual o objetivo de ler esse XML ? Você irá carregar uma tabela ?

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    Como executar tarefas ao iniciar o SQL Server ?
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!570.entry
    Classifique as respostas. O seu feedback é imprescindível
    quarta-feira, 20 de maio de 2009 17:16
  • Oi Gustavo,


    Eu irei pegar os valores do XML e executar uma proc.
    O fluxo é, eu recebo um xml, rodo uma proc para carregar ou não os dados e de acordo com o que a proc me retorna eu gero um arquivo de saída.
    Essa parte de rodar a proc e gerar o arquivo de saída não está sendo problema.
    O problema é ler parte do xml.

    No caso, irei executar a proc a quantidade de vezes que eu tiver <ITEM> no xml.
    No exemplo, irei executar a proc 3 vezes.

    Eu consigo salvar os valores de <ITEM> em variáveis e executar a proc com esses valores, porém também preciso ler   <NUM_RMA>1234</NUM_RMA>
    <NUM_NF>055888</NUM_NF>
    <DATA_RECEBIMENTO>25/02/2009</DATA_RECEBIMENTO>

    Se eu fizer a seguinte alteração no xml, eu consigo ler
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <DADOS>
        <ITEMS>
                <NUM_RMA>1234</NUM_RMA>
                <NUM_NF>055888</NUM_NF>
                <DATA_RECEBIMENTO>25/02/2009</DATA_RECEBIMENTO>
            <ITEM>
                <IMEI>111111111111</IMEI>
                <PART_NUMBER>XPTO123</PART_NUMBER>
                <COD_DEF_RECL>AC12</COD_DEF_RECL>
            </ITEM>
            <ITEM>
                <IMEI>222222222222</IMEI>
                <PART_NUMBER>XPTO123</PART_NUMBER>
                <COD_DEF_RECL>XR56</COD_DEF_RECL>
            </ITEM>
            <ITEM>
                <IMEI>333333333333</IMEI>
                <PART_NUMBER>XPTO999</PART_NUMBER>
                <COD_DEF_RECL>AC12</COD_DEF_RECL>
            </ITEM>
        </ITEMS>
    </DADOS>

    Repare que adicionei <ITEMS> , assim eu consigo ler, porém não é dessa maneira que eu recebo o xml e não posso "pedir" para que o outro lado altere o arquivo que me envia.


    Obrigado,

    Cassiano
    quarta-feira, 20 de maio de 2009 18:01
  • Cassiano,

    Você deseja ler os dados que estão em formato XML armazená-los e depois executá-los dentro de uma Stored Procedure?


    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    quarta-feira, 20 de maio de 2009 18:17
    Moderador
  • Junior,

    Sim, meu objetivo é armazenar o valor em alguma variável, para depois executá-los em uma sp.

    Eu tenho um "Foreach Loop Container" para ler vários XMLs que eu possa ter.
    Dentro dele eu tenho um DataFlow Task que dentro tem o "XML Source" para eu ler o xml e depois um "Script Component" para eu associar o valor do xml às váriáveis.
    Saindo do DataFlow Task e voltando dentro do "Foreach Loop Container" eu um "Execute SQL Task" para rodar a sp.

    Isso eu já tenho pronto e funcionando para um outro XML.

    O que eu estou fazendo é mudando isso para esse formato de XML que eu postei.
    Meu problema nesse formato está sendo em pegar os valores fora do <ITEM> e ainda não pensei em como executar a sp para cada <ITEM> que eu tenho (no jeito que tenho pronto, ele executa a sp para cada xml, talvez chamando a sp dentro do script possa funcionar).

    Obrigado,

    Cassiano

    quarta-feira, 20 de maio de 2009 19:21
  • Cassiano,

    Certo, o problema é pegar os valores fora da tag <items>.

    Mas o que teriamos fora desta tag?


    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    quarta-feira, 20 de maio de 2009 19:30
    Moderador

  • Júnior,
    Eu preciso dos valores em negrito:

                <NUM_RMA>1234 </NUM_RMA>
                <NUM_NF>055888 </NUM_NF>
                <DATA_RECEBIMENTO>25/02/2009 </DATA_RECEBIMENTO>


    É como se eu tivesse uma tabela com essas 3 colunas (mais um ID) e outra tabela com as colunas dos <ITEM> (IMEI, PART_NUMBER,COD_DEF_RECL mais o FK do ID da primeira tabela).

    Essa é a extrutura do meu xml que eu tenho que enviar para a proc rodar.

    no caso a proc precisa como entrada
    @NUM_RMA, @NUM_NF, @DATA_RECEBIMENTO, @IMEI, @PART_NUMBER, @COD_DEF_RECL

    Obrigado,

    Cassiano
    quarta-feira, 20 de maio de 2009 19:54
  • Cassiano,

    Veja se este exemplo ajuda:

    declare @dadosxml xml

    set @dadosxml = '<?xml version="1.0"?>

    <root>

    <cliente id="1">

    <prod id="321"/>

    <prod id="543"/>

    <prod id="762"/>

    <prod id="325"/>

    </cliente>

    <cliente id="2">

    <prod id="289"/>

    <prod id="776"/>

    <prod id="335"/>

    <prod id="1020"/>

    </cliente>

    </root>'

    --print convert(nvarchar(4000),@dadosxml)

    SELECT

    t.c.value('../@id[1]','int') as IdCliente,

    t.c.value('@id[1]','int') as IdProduto

    FROM

    @dadosxml.nodes('/root/cliente/prod') as t(c)

    dECLARE @x xml
    SET @x='<Root>
        <row id="1"><name>Larry</name><oflw>some text</oflw></row>
        <row id="2"><name>moe</name></row>
        <row id="3" />
    </Root>'
    SELECT T.c.query('.') AS result
    FROM   @x.nodes('/Root/row') T(c)
    GO


    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    quarta-feira, 20 de maio de 2009 20:00
    Moderador
  • Olá Cassiano,

    Se o seu XML tem esses nós apenas uma vez ? Ou os nós NUM_RMA, NUM_NF e DATA_RECEBIMENTO irão se repetir várias vezes ? Se for apenas uma vez, podemos fazer pelo Control Flow com o XML e o Execute SQL Task. Se for várias vezes, pode ser melhor importar os dados XML e disparar uma rotina apartir do banco.

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    Como executar tarefas ao iniciar o SQL Server ?
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!570.entry
    Classifique as respostas. O seu feedback é imprescindível
    quinta-feira, 21 de maio de 2009 16:40
  • Maia,

    Era isso que estava faltando para eu entender!!!


    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    quinta-feira, 21 de maio de 2009 17:39
    Moderador
  • Olá Gustavo,


    O XML tem o nó
                <NUM_RMA>1234 </NUM_RMA>
                <NUM_NF>055888 </NUM_NF>
                <DATA_RECEBIMENTO>25/02/2009 </DATA_RECEBIMENTO>
    Apenas uma vez por arquivo.

    Como seria o uso do xml task para ler os valores?

    Obrigado pela ajuda pessoal.

    att,

    Cassiano
    quinta-feira, 21 de maio de 2009 18:48
  • Pelo o que entendi, eu tenho que pegar o meu XML e gerar um outro XML no formato que eu consiga fazer a leitura, certo?

    Só não sei como fazer o XSL que gere o segundo XML  no formato que eu preciso.
    "Basicamente" seria só colocar o <ITEMS> e </ITEMS> com o conteúdo do xml, ficando com o segundo xml igual o que postei (quarta-feira, 20 de maio de 2009 18:01) - (não sei como colocar link pra um post já feito).


    Depois disso é só fazer o data flow task e xml source.

    Acho que é isso.
    sexta-feira, 22 de maio de 2009 18:42
  • Dei uma pesquisada no MSDN gringo e achei a resposta.
    ______________________________________________________

    The SSIS Xml Source component ignores the root xml element by design. 

     

    So, to recognize that otherwise ignored root element as a output, one would need to wrap that root element with yet another "root" element, such as the below "<wrapper/>" element, probably via an XSL transform in a Xml control flow task.

     

    <wrapper>

    <root client="2325" date="020608">

         <name>toto</name>

         <job>cont</job>

    </root>

    </wrapper>


    ______________________________________________________


    http://social.msdn.microsoft.com/Forums/en-US/sqlintegrationservices/thread/c990397f-1c16-4160-acc9-3a4d8961f4a5/


    Usei o seguinte xsl e deixei o xml do jeito que eu tinha comentado que carregaria o xml

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:template match="/">
     <ITEMS>
            <xsl:apply-templates/>
     </ITEMS>
      </xsl:template>
      <xsl:template match="node()|@*">
        <xsl:copy>
          <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
      </xsl:template>
    </xsl:stylesheet>
    

    Isso fez com que eu tenha 2 tabelas.


    Fica aí a dica para quem encontrar o mesmo problema.


    att,

    Cassiano

    • Marcado como Resposta Cassiano Sanches segunda-feira, 25 de maio de 2009 11:34
    segunda-feira, 25 de maio de 2009 11:34
  • Cassiano,

    Obrigado pelo retorno.


    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    segunda-feira, 25 de maio de 2009 18:40
    Moderador