0

在 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 服务任务通过使用相同的 Web 服务运行另一个 Web 服务任务返回了我所期望的内容,但将该输出直接放入一个文件中。

4

1 回答 1

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。

于 2011-11-22T18:21:33.347 回答