【问题标题】:SSIS: Create CSV File From XML Source Using Variable dataSSIS:使用可变数据从 XML 源创建 CSV 文件
【发布时间】:2011-11-21 16:56:39
【问题描述】:

在 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 服务任务返回了我所期望的结果,但将该输出直接放入一个文件中。

【问题讨论】:

  • 就调试而言,您尝试过什么?这里没有太多信息可以继续,这很危险地接近“不是一个真正的问题”。使用 3401 代表,您应该知道发布更多细节。
  • 查看数据流任务时,是否显示来自您的数据源的 0 条记录?
  • @JeradRose:实际上,它没有向我显示任何内容(除了“成功”)。我希望我可以更具体一些,但我只是没有通过我所期望的那样获得数据。
  • 您是否尝试过在数据流任务之前放置断点,然后为 XML 变量添加 Watch?这应该清楚地表明问题是与填充变量有关,还是与从变量读取的 DFT 有关。
  • @JaredRose - 是的,在 DFT 之前和之后设置断点证明变量已设置。输出窗口中没有报告运行时错误。

标签: xml ssis flat-file dataflow


【解决方案1】:

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

问题在于将名称空间包含在来自 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 Source 可以正确处理变量中传递的 XML。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    相关资源
    最近更新 更多