XslCompiledTransform:如何读取转换后的文本,而不保存到文件

时间:2015-08-03 16:14:31

标签: c# ssis xslcompiledtransform

输入: 我的输入文件是XML文件。它们由SSIS中的foreach文件枚举器读取。

过程: SSIS脚本组件(C#)从变量中读取文件名。 我创建了一个XSL文件,用于将XML转换为必要的格式。脚本任务使用XSL文件,并转换XML文件(到文本)

以下是我使用的代码:

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

问题:

正如预期的那样,这会将转换后的文本内容写入上述输出文件。我想阅读每一行,处理它,并加载到数据库。

现在,写入文件,再次阅读它是一种开销。

有没有办法可以将转换后的内容读入任何对象并迭代它(实际上没有写入文件)?喜欢Stream还是什么?

可替换地:

虽然 SSIS“XML任务”具有“操作类型= XSLT”功能,但如果“SourceType”是可变的,则它不会读取XML,并且我在文件名中包含路径变量即可。它期待变量中的XML内容。任何可能的工作?

请在评论中询问具体细节,以便我可以相应更新。谢谢。

我无法编辑XML任务的表达式,如图enter image description here

所示

2 个答案:

答案 0 :(得分:1)

不使用脚本任务,而是使用数据流。数据流用于转换内存中的数据流,因此听起来就像您所追求的那样。

有两种选择:

  1. 如果您需要执行的转换过于复杂,则可以设置XML Source并使用表达式,以便源使用文件路径变量作为其连接字符串。完成后,您可以添加进行转换所需的任何其他组件,然后添加数据库目标。
  2. 如果转换更复杂并且您想要使用XSL,则可以在数据流中use a Script Component as a source,并选择拾取XML和XSD,然后执行转换。 Here's an example执行转换并将数据行放入内存而不是文件中。 MSDN lists all of the overloads available,如果这不是您的最佳方向。然后,您将结果行作为输出传递到数据流的其余部分,并从那里直接转到数据库目标组件。
  3. 无论哪种方式,请确保将目的地设置为"快速加载"加快速度。

    如果您决定在数据流中完全执行此操作,但如果您不再需要它,那么就XML任务而言,您需要使用文件连接作为源代替的可变即可。 MSDN notes 变量仅用于保存XML内容的变量。您需要设置表达式in the same way you would for any file source,并传递文件路径变量。

答案 1 :(得分:0)

我能够解决这个问题。 变换的重载之一有所帮助。

这是我做的:

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