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

SSIS: Create CSV File From XML Source Using Variable data

在SSIS中,正在尝试使用来自Web服务的数据来创建csv文件。

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

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

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

在DFT之前和之后设置一个断点可以证明该变量已设置为我期望的XML文本。

例如,XML看起来像这样(为了保护专有信息而更改了名称):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?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 Service任务,但将输出直接放入文件中,验证了Web Service任务可以返回期望的结果。


以下是回答,说明了我为解决此问题所做的工作。如果有人可以用"为什么"更好地回答,我将其标记为答案。

问题在于将名称空间与来自Web服务的XML结合在一起,并与在xsd中使用" targetNamespace"结合在一起。

最初,xsd看起来像这样:

1
2
3
4
5
6
7
8
9
<?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属性。

1
2
3
4
5
6
7
8
<?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中删除名称空间,然后将其返回:

1
2
3
4
5
6
7
8
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。