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;
}

(コードは 1 行で記述していることに気付きましたが、これはより簡潔であり、将来必要に応じて XML をさらに変更することができます)。

これにより、XML ソースは変数に渡された XML を正しく処理します。

于 2011-11-22T18:21:33.347 に答える