You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在SSIS中合并多份XML文件及实现特定字段处理的技术问询

SSIS多XML文件合并及字段处理解决方案

整体思路

放弃SSIS自带的XML任务(仅支持两文件合并),改用Foreach循环容器遍历所有XML文件,逐个读取解析后处理字段,最终将所有处理后的<Email>节点整合为单个XML文件。


步骤1:配置变量与Foreach循环容器

  1. 创建以下SSIS变量:

    • FolderPath(字符串):存储XML文件所在文件夹路径,示例值:C:\XMLFiles
    • CurrentFileName(字符串):存储当前遍历到的文件名
    • FinalXML(字符串):存储最终合并后的XML内容,初始值设为<Emails></Emails>
  2. 添加Foreach循环容器,配置为「Foreach文件枚举器」:

    • 枚举器配置:选择FolderPath变量,文件筛选器设为*.xml
    • 变量映射:将当前文件名映射到CurrentFileName变量

步骤2:读取单个XML文件内容

在Foreach循环容器内添加数据流任务,数据流中配置:

  1. 添加XML源:
    • 数据源选择「文件连接管理器」,连接字符串绑定CurrentFileName变量
    • 生成/选择XML架构:可通过示例XML生成XSD,确保能读取EmailReceivedDTM、EmailSubject、EmailBody三个核心字段

步骤3:添加状态标记与提取首个数值

在数据流中添加派生列转换和脚本组件完成字段处理:

  1. 生成Status标记:
    在派生列中新增字段Status,表达式为:

    LEFT(LTRIM(EmailSubject), 3) == "Fax" ? 1 : 0
    

    (注:用LTRIM去掉Subject开头的空格,避免空格导致判断错误)

  2. 提取首个数值:
    添加脚本组件(转换类型),输入列勾选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

推荐采用「记录集目标+脚本任务」的组合实现:

  1. 在数据流末尾添加记录集目标,将处理后的所有行存入对象变量EmailRecords
  2. 在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内容时,若遇到转义字符(如&lt;![CDATA[),需先转义为<![CDATA[再进行数值提取
  • 可根据实际需求调整正则表达式(如支持负号、小数点的数值匹配)
  • 若XML文件编码不一致,需在XML源中指定对应编码格式

内容的提问来源于stack exchange,提问作者Rojalin Mohanty

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 12:16:34