在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任务而返回我期望的内容,但是将该输出直接放入文件中。
答案 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。