XslCompiledTransform:如何在不保存到文件的情况下读取转换后的文本
XslCompiledTransform: how to read the transformed text, without saving to file
输入:
我的输入文件是 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 Task" 具有 "Operation Type = XSLT" 功能,它没有读取 XML 如果 "SourceType" 是变量,我在变量 中给出文件名和路径。它期望变量中的 XML 内容。有什么解决办法吗?
请在评论中询问具体细节,以便我相应更新。谢谢。
我无法编辑 XML 任务的表达式,如图所示
不使用脚本任务,而是使用数据流。数据流用于转换内存中的数据流,所以听起来正是您所追求的。
几个选项:
- 如果您需要进行的转换不是太复杂,您可以设置一个 XML 源并使用表达式,以便该源使用文件路径变量作为其连接字符串。完成后,您可以添加执行转换所需的任何其他组件,然后添加数据库目标。
- 如果转换更复杂并且您想使用 XSL,您可以 use a Script Component as a source in the Data Flow, and code picking up the XML and XSD, and carrying out the transform. Here's an example of carrying out the transform and getting the rows of data into memory instead of into a file. MSDN lists all of the overloads available,如果这不是您的最佳方向。然后,您会将生成的行作为输出传递到数据流的其余部分,然后您可以从那里直接转到数据库目标组件。
无论哪种方式,请确保将目的地设置为 "fast load" 以加快速度。
虽然如果您决定完全在数据流中执行此操作则不需要它,但就 XML 任务而言,您需要使用 文件连接 作为来源而不是 Variable。 MSDN notes that Variable is only for use with a variable that holds the XML content. You'll need to set up an expression in the same way you would for any file source,并将文件路径变量传入。
我能解决这个问题。
T运行sform 的重载之一有所帮助。
这是我所做的:
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;
}
}
我需要帮助阅读 t运行sformed 文本中的行。看起来我需要输出到流,然后使用 StringWriter。
然后我根据新行拆分它 运行 foreach
输入: 我的输入文件是 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 Task" 具有 "Operation Type = XSLT" 功能,它没有读取 XML 如果 "SourceType" 是变量,我在变量 中给出文件名和路径。它期望变量中的 XML 内容。有什么解决办法吗?
请在评论中询问具体细节,以便我相应更新。谢谢。
我无法编辑 XML 任务的表达式,如图所示
不使用脚本任务,而是使用数据流。数据流用于转换内存中的数据流,所以听起来正是您所追求的。
几个选项:
- 如果您需要进行的转换不是太复杂,您可以设置一个 XML 源并使用表达式,以便该源使用文件路径变量作为其连接字符串。完成后,您可以添加执行转换所需的任何其他组件,然后添加数据库目标。
- 如果转换更复杂并且您想使用 XSL,您可以 use a Script Component as a source in the Data Flow, and code picking up the XML and XSD, and carrying out the transform. Here's an example of carrying out the transform and getting the rows of data into memory instead of into a file. MSDN lists all of the overloads available,如果这不是您的最佳方向。然后,您会将生成的行作为输出传递到数据流的其余部分,然后您可以从那里直接转到数据库目标组件。
无论哪种方式,请确保将目的地设置为 "fast load" 以加快速度。
虽然如果您决定完全在数据流中执行此操作则不需要它,但就 XML 任务而言,您需要使用 文件连接 作为来源而不是 Variable。 MSDN notes that Variable is only for use with a variable that holds the XML content. You'll need to set up an expression in the same way you would for any file source,并将文件路径变量传入。
我能解决这个问题。 T运行sform 的重载之一有所帮助。
这是我所做的:
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;
}
}
我需要帮助阅读 t运行sformed 文本中的行。看起来我需要输出到流,然后使用 StringWriter。
然后我根据新行拆分它 运行 foreach