0

输入:我的输入文件是 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");
}

问题:

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

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

有没有办法可以将转换后的内容读入任何对象并对其进行迭代(而不实际写入文件)?像流什么的?

或者:

尽管SSIS“XML 任务”具有“操作类型 = XSLT”功能,但如果“SourceType”是变量并且我在变量中给出带有路径的文件名,则它不会读取 XML。它期望变量中的 XML 内容。任何可能的解决方法?

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

如图所示,我无法编辑 XML 任务的表达式在此处输入图像描述

4

2 回答 2

1

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

几个选项:

  1. 如果您需要进行的转换不是太复杂,您可以设置一个 XML 源并使用一个表达式,以便源使用文件路径变量作为其连接字符串。完成后,您可以添加执行转换所需的任何其他组件,然后添加您的数据库目标。
  2. 如果转换更复杂并且您想使用 XSL,您可以使用脚本组件作为数据流中的源,并使用代码获取 XML 和 XSD,并执行转换。这是一个执行转换并将数据行放入内存而不是文件的示例。MSDN 列出了所有可用的重载,如果这不是您的最佳方向。然后,您会将结果行作为输出传递到数据流的其余部分,然后您可以从那里直接进入数据库目标组件。

无论哪种方式,请确保将目标设置为“快速加载”以加快速度。


如果您决定完全在数据流中执行此操作,则不需要它,但就 XML 任务而言,您需要使用文件连接作为源而不是变量MSDN 指出Variable仅用于保存 XML 内容的变量。您需要以与任何文件源相同的方式设置表达式,并传入文件路径变量。

于 2015-08-03T18:57:09.473 回答
0

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

这是我所做的:

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

于 2015-08-04T14:20:38.453 回答