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 ответа
Вместо использования задачи "Сценарий" используйте поток данных. Поток данных предназначен для преобразования потоков данных в памяти, поэтому звучит именно так, как вам нужно.
Пара вариантов:
- Если необходимые преобразования не слишком сложны, вы можете настроить источник XML и использовать выражение, чтобы источник использовал переменную пути к файлу в качестве строки подключения. После того, как вы это сделали, вы можете добавить любые дополнительные компоненты, необходимые для выполнения преобразований, а затем место назначения вашей базы данных.
- Если преобразования являются более сложными, и вы хотите использовать 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