在SSIS中合并多份XML文件及实现特定字段处理的技术问询
SSIS多XML文件合并及字段处理解决方案
整体思路
放弃SSIS自带的XML任务(仅支持两文件合并),改用Foreach循环容器遍历所有XML文件,逐个读取解析后处理字段,最终将所有处理后的<Email>节点整合为单个XML文件。
步骤1:配置变量与Foreach循环容器
创建以下SSIS变量:
FolderPath(字符串):存储XML文件所在文件夹路径,示例值:C:\XMLFilesCurrentFileName(字符串):存储当前遍历到的文件名FinalXML(字符串):存储最终合并后的XML内容,初始值设为<Emails></Emails>
添加Foreach循环容器,配置为「Foreach文件枚举器」:
- 枚举器配置:选择
FolderPath变量,文件筛选器设为*.xml - 变量映射:将当前文件名映射到
CurrentFileName变量
- 枚举器配置:选择
步骤2:读取单个XML文件内容
在Foreach循环容器内添加数据流任务,数据流中配置:
- 添加XML源:
- 数据源选择「文件连接管理器」,连接字符串绑定
CurrentFileName变量 - 生成/选择XML架构:可通过示例XML生成XSD,确保能读取
EmailReceivedDTM、EmailSubject、EmailBody三个核心字段
- 数据源选择「文件连接管理器」,连接字符串绑定
步骤3:添加状态标记与提取首个数值
在数据流中添加派生列转换和脚本组件完成字段处理:
生成Status标记:
在派生列中新增字段Status,表达式为:LEFT(LTRIM(EmailSubject), 3) == "Fax" ? 1 : 0(注:用
LTRIM去掉Subject开头的空格,避免空格导致判断错误)提取首个数值:
添加脚本组件(转换类型),输入列勾选EmailBody,输出列新增FirstNumber(字符串类型),脚本编辑器中编写C#代码:using System.Text.RegularExpressions; public override void Input0_ProcessInputRow(Input0Buffer Row) { string bodyContent = Row.EmailBody; // 匹配第一个连续数字序列 Match match = Regex.Match(bodyContent, @"\d+"); Row.FirstNumber = match.Success ? match.Value : string.Empty; }
步骤4:合并处理后的数据为单个XML
推荐采用「记录集目标+脚本任务」的组合实现:
- 在数据流末尾添加记录集目标,将处理后的所有行存入对象变量
EmailRecords - 在Foreach循环外添加脚本任务,读取
EmailRecords变量并拼接XML:DataTable dt = new DataTable(); new OleDbDataAdapter().Fill(dt, Dts.Variables["EmailRecords"].Value); StringBuilder xmlBuilder = new StringBuilder(Dts.Variables["FinalXML"].Value.ToString()); foreach (DataRow row in dt.Rows) { xmlBuilder.AppendLine(" <Email>"); xmlBuilder.AppendLine($" <EmailReceivedDTM>{row["EmailReceivedDTM"]}</EmailReceivedDTM>"); xmlBuilder.AppendLine($" <EmailSubject>{row["EmailSubject"]}</EmailSubject>"); xmlBuilder.AppendLine($" <EmailBody>{row["EmailBody"]}</EmailBody>"); xmlBuilder.AppendLine($" <Status>{row["Status"]}</Status>"); xmlBuilder.AppendLine($" <FirstNumber>{row["FirstNumber"]}</FirstNumber>"); xmlBuilder.AppendLine(" </Email>"); } // 插入到闭合标签前 int closeTagPos = xmlBuilder.ToString().LastIndexOf("</Emails>"); xmlBuilder.Insert(closeTagPos, Environment.NewLine); // 写入最终文件 System.IO.File.WriteAllText(@"C:\Output\MergedEmails.xml", xmlBuilder.ToString());
注意事项
- 处理CDATA内容时,若遇到转义字符(如
<
