Usuário com melhor resposta
Dúvida Usando XML Source!

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- Editado Cassiano Sanches quarta-feira, 20 de maio de 2009 15:34
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
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 -
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 -
-
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
-
-
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 -
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 -
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 -
-
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 -
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. -
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
-