XslCompiledTransform: как читать преобразованный текст без сохранения в файл

Входные данные: Мои входные файлы являются файлами XML. Они читаются перечислителем файлов foreach в SSIS.

Процесс: компонент сценария SSIS (C#) считывает имя файла из переменной. Я создал XSL-файл для преобразования XML в необходимый формат. Задача сценария использует файл XSL и преобразует файлы XML (в текст)

Вот фрагмент кода, который я использовал:

public override void CreateNewOutputRows()
{
    XslCompiledTransform transformer = new XslCompiledTransform();
    transformer.Load(_xsltFile);
    transformer.Transform(_fileName, @"C:\macro3\outputTestFile.txt");
}

Проблема:

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

Теперь запись в файл и повторное чтение - это непроизводительные затраты.

Есть ли способ, которым я могу прочитать преобразованный контент в любой объект и перебрать его (без фактической записи в файл)? Как поток или что-то?

В качестве альтернативы:

Хотя SSIS "Задача XML" имеет функцию "Operation Type = XSLT", она не читает XML, если "SourceType" является переменной, и я даю имя файла с путем в переменной. Ожидается содержание XML в переменной. Любая работа вокруг возможна?

Пожалуйста, уточняйте подробности в комментариях, чтобы я мог обновиться соответствующим образом. Спасибо.

Я не могу редактировать задачу "Выражения XML", как показано на рисунке введите описание изображения здесь

2 ответа

Решение

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

Пара вариантов:

  1. Если необходимые преобразования не слишком сложны, вы можете настроить источник XML и использовать выражение, чтобы источник использовал переменную пути к файлу в качестве строки подключения. После того, как вы это сделали, вы можете добавить любые дополнительные компоненты, необходимые для выполнения преобразований, а затем место назначения вашей базы данных.
  2. Если преобразования являются более сложными, и вы хотите использовать XSL, вы можете использовать компонент Script в качестве источника в потоке данных и код, выбирающий XML и XSD, и выполняющий преобразование. Вот пример выполнения преобразования и получения строк данных в память, а не в файл. MSDN перечисляет все доступные перегрузки, если это не лучшее направление для вас. Затем вы передадите результирующие строки в качестве вывода в остальную часть потока данных, и оттуда вы сможете перейти непосредственно к компоненту назначения базы данных.

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


Хотя вам это не понадобится, если вы решите сделать это целиком в потоке данных, для выполнения задачи XML вам необходимо использовать соединение с файлами в качестве источника вместо переменной. MSDN отмечает, что переменная предназначена только для использования с переменной, содержащей содержимое XML. Вам нужно будет настроить выражение так же, как для любого источника файла, и передать переменную пути к файлу в.

Я могу решить это. Помогла одна из перегрузок Преобразований.

Вот что я сделал:

public override void CreateNewOutputRows()
{

    XmlReader read = XmlReader.Create(_fileName);

    XslCompiledTransform transformer = new XslCompiledTransform();
    transformer.Load(_xsltFile);
    StringWriter sw = new StringWriter();

    transformer.Transform(read, null, sw);

    String[] rows = sw.ToString().Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None);
    String tag;
    foreach (String row in rows)
    {
        // additional code here
        TagValueBuffer.AddRow();
        TagValueBuffer.TagValue = row;
    }

}

Мне нужна была помощь с чтением строк из преобразованного текста. Похоже, мне нужно вывести в поток, а затем использовать StringWriter.

Затем я разделил его на основе новых строк и запустил foreach

Другие вопросы по тегам