2011-11-21 163 views
0

在SSIS中,我試圖使用來自Web服務的數據創建一個csv文件。SSIS:使用可變數據從XML源創建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服務任務,但將該輸出直接放入文件中,從而返回所期望的內容。

+0

你有什麼嘗試,只要調試?這裏沒有太多的信息可以繼續下去,這很危險地接近「不是真正的問題」。有了3401代表,您應該知道發佈更多細節。 –

+0

當您查看數據流任務時,是否顯示來自數據源的0條記錄? –

+0

@JeradRose:實際上,它沒有顯示任何東西(除了「成功」)。我希望我可以更具體一些,但我只是沒有通過我期望的數據獲取數據。 –

回答

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。