SSIS:使用可变数据从XML源创建CSV文件

时间:2011-11-21 16:56:40

标签: xml ssis flat-file dataflow

在SSIS中,我尝试使用来自Web服务的数据来创建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 Service任务通过使用相同的Web服务运行另一个Web Service任务而返回我期望的内容,但是将该输出直接放入文件中。

1 个答案:

答案 0 :(得分: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 Source。

脚本代码只是从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 Source正确处理变量中传递的XML。