2011-11-21 164 views
0

在SSIS中,我试图使用来自Web服务的数据创建一个csv文件。SSIS:使用可变数据从XML源创建CSV文件

在我的控制流中,我创建了一个Web服务任务,将其输出保存到用户变量中。

当Web服务任务完成时,它启动一个数据流任务。

数据流任务具有单个XML源,其数据访问模式设置为“XML数据来自变量”,指向(假定)具有来自Web服务的XML数据的变量。

在DFT之前和之后设置断点,证明该变量正在设置为我期望的XML文本。

例如,XML看起来是这样的(名称变更为保护专有信息):

<?xml version="1.0" encoding="utf-16"?> 
<ArrayOfMyItemObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <MyItemObject> 
    <OrderID xmlns="http://webservices.mycompany.com/MyPath/">111111</OrderID> 
    <ItemID xmlns="http://webservices.mycompany.com/MyPath/">123456</ItemID> 
    </MyItemObject> 
    <MyItemObject> 
    <OrderID xmlns="http://webservices.mycompany.com/MyPath/">222222</OrderID> 
    <ItemID xmlns="http://webservices.mycompany.com/MyPath/">678901</ItemID> 
    </MyItemObject> 
    <MyItemObject> 
    <OrderID xmlns="http://webservices.mycompany.com/MyPath/">333333</OrderID> 
    <ItemID xmlns="http://webservices.mycompany.com/MyPath/">234567</ItemID> 
    </MyItemObject> 
    <MyItemObject> 
    <OrderID xmlns="http://webservices.mycompany.com/MyPath/">444444</OrderID> 
    <ItemID xmlns="http://webservices.mycompany.com/MyPath/">890123</ItemID> 
    </MyItemObject> 
</ArrayOfMyItemObject> 

这个数据流任务只是处理成一个平面文件目标(CSV文件)。平面文件中的列被映射到XML中的值。

但是,当我运行这个,我只获得列名称,并没有数据。

我已验证Web服务任务通过使用相同的Web服务运行另一个Web服务任务,但将该输出直接放入文件中,从而返回所期望的内容。

+0

你有什么尝试,只要调试?这里没有太多的信息可以继续下去,这很危险地接近“不是真正的问题”。有了3401代表,您应该知道发布更多细节。 –

+0

当您查看数据流任务时,是否显示来自数据源的0条记录? –

+0

@JeradRose:实际上,它没有显示任何东西(除了“成功”)。我希望我可以更具体一些,但我只是没有通过我期望的数据获取数据。 –

回答

0

这是一个答案,说明我为解决此问题所做的工作。如果有人可以用“为什么”回答得更好,我会将其标记为答案。

问题在于将名称空间与Web服务中的XML一起使用,并在xsd中使用“targetNamespace”。

本来,XSD看起来是这样的:

<?xml version="1.0"?> 
<xsd:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      attributeFormDefault="unqualified" 
      elementFormDefault="qualified" 
      targetNamespace="http://webservices.mycompany.com/MyPath/"> 
    <!-- reset of xsd here --> 
</xsd:schema> 

我需要删除targetNamespace属性。

<?xml version="1.0"?> 
<xsd:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      attributeFormDefault="unqualified" 
      elementFormDefault="qualified" 
    <!-- reset of xsd here --> 
</xsd:schema> 

然后,我需要删除从Web服务返回的XML中对该命名空间的引用。为此,我在Web服务任务之后立即创建了一个脚本任务。此任务具有为保存XML文本的变量定义的ReadWriteVariable,它将通过数据流任务中的XML源传递。

脚本的代码只是将删除XML命名空间和其返回:

public void Main() 
{ 
    string xml = Dts.Variables["User::WebServicesOutput"].Value.ToString(); 
    xml = xml.Replace(" xmlns=\"http://webservices.mycompany.com/MyPath/\"", ""); 
    Dts.Variables["User::WebServicesOutput"].Value = xml; 

    Dts.TaskResult = (int)ScriptResults.Success; 
} 

(我知道我的代码做在同一行,但是这是更清洁,并让我进一步如果我希望将来修改XML)。

通过这样做,XML源可以正确处理传递给变量的XML。