SSIS: создание файла CSV из источника XML с использованием переменных данных - PullRequest
0 голосов
/ 21 ноября 2011

В SSIS я пытаюсь использовать данные из веб-службы для создания файла csv.

В моем потоке управления я создал задачу веб-службы, которая сохраняет свои выходные данные в пользовательской переменной.

Когда задача веб-службы завершается, она запускает задачу потока данных.

Задача потока данных имеет один источник XML с режимом доступа к данным, установленным на «Данные XML из переменной», указывающим напеременная, которая (предположительно) содержит данные 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.

Однако, когда я запускаю это, я получаю только имена столбцов и никаких данных.

Я убедился, чтоЗадача веб-службы возвращает то, что я ожидаю, запустив другую задачу веб-службы с использованием того же веб-службы, но поместив этот вывод непосредственно в файл.

1 Ответ

0 голосов
/ 22 ноября 2011

Вот ответ, который говорит, что я сделал, чтобы обойти эту проблему.Если кто-то может ответить лучше с помощью «почему», я отмечу это как ответ.

Проблема заключалась в том, чтобы включить пространство имен с XML из веб-службы в сочетании с использованием «targetNamespace» в xsd.

Изначально 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>

Затем мне нужно было удалить ссылки на это пространство имен.в 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, переданный в переменной.

...