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。