SSIS中遍历XML文件应使用Foreach Loop Container,配置File Enumerator、路径、通配符及变量映射;原生XML Source不支持变量路径,需用Script Task+XmlDocument/XDocument或第三方XML Task替代;结构不一致时通过根节点识别版本并分支处理;性能优化需禁用DTD、改用XmlReader流式读取、关闭XSD验证。

SSIS中用Foreach Loop Container遍历XML文件
直接用 Foreach Loop Container 是最稳妥的方式,它能自动枚举指定文件夹下的所有 .xml 文件,并为每个文件生成独立的变量(如 @[User::CurrentXMLPath]),后续组件可直接引用。别试图用脚本任务手动写循环逻辑——既难调试又绕过SSIS原生控制流。
关键配置点:
- Enumerator 类型选
Foreach File Enumerator - Folder 填绝对路径,比如
C:\Data\Inbound\;注意 SSIS 包运行账户必须有该路径的读取权限 - Files 填
*.xml,若需子目录递归,勾选Traverse subfolders - Variable Mappings 里绑定一个字符串变量(如
@[User::CurrentXMLPath])到 Index 0
XML Source 组件不支持变量路径?用 Script Task + XmlTask 替代
原生 XML Source 组件在设计时就固化了文件路径,无法动态绑定变量,强行改会报错 "The XML file path is not valid"。这不是配置问题,是组件限制。
可行方案是绕过 XML Source,改用以下组合:
- 在 Foreach 循环内放一个
Script Task,用 C# 或 VB.NET 读取@[User::CurrentXMLPath]内容到System.Xml.XmlDocument或XDocument - 把解析后的节点数据转成
DataTable或Object类型变量,传给下游ADO NET Source(设为“使用变量”模式) - 或更轻量:用第三方
XML Task(来自 KingswaySoft 或 CozyRoc),它原生支持表达式驱动的文件路径和 XPath 查询
多个XML结构不一致时如何稳定映射字段
如果一批XML文件的 schema 不统一(比如有的有 节点,有的只有 ),硬写 XPath 会频繁失败。不能靠 try-catch 吞掉错误,得从设计上隔离差异。
建议分三步处理:
- 先用
Script Task提取每个文件的根节点名或版本属性(如doc.DocumentElement?.GetAttribute("version")),存入变量@[User::XMLSchemaVersion] - 用
Expression配合Precedence Constraint分支:不同 version 走不同数据流路径 - 每条路径里配专属的
XML Task或Script Component,各自维护独立的 XPath 映射规则,避免混用
性能瓶颈常卡在DOM解析和XML验证上
批量处理上百个 XML 文件时,XmlDocument.Load() 容易触发内存暴涨甚至超时,尤其文件含 DTD 或外部实体引用。这不是 SSIS 的锅,是 .NET XML 解析器默认行为。
优化要点:
- 在
Script Task中禁用 DTD 解析:var settings = new XmlReaderSettings { DtdProcessing = DtdProcessing.Ignore }; - 改用
XmlReader流式读取,而非全量加载 DOM;对大文件尤其必要 - 关闭
XML Task的 “Validate XML against XSD” 选项,除非业务强依赖校验 - 考虑预处理:用 PowerShell 批量剥离注释、格式化空格,再交给 SSIS —— 减少无效字符解析开销
真正麻烦的不是怎么循环,而是每个 XML 文件背后可能藏着不同的命名空间、编码声明、空值表示法(xsi:nil="true" 还是空标签),这些细节一旦漏判,数据就静默错位。留心看日志里 Warning: 0x80049304 这类 XML 解析警告,它们往往比错误更危险。










