SSIS新手求助:如何通过反序列化将嵌套XML的parameter元素加载至缓冲区
在SSIS中反序列化XML并将节点元素加载到缓冲区的方法
嘿,作为SSIS新手,你要处理的这个XML解析需求其实挺常见的,我给你整理了两种实用的方法,一步步来就能搞定:
方法一:使用XML Source组件(无代码方式)
这是最简便的方法,适合结构固定的XML:
- 第一步:修正XML结构
你提供的XML示例有未闭合的标签(比如<selected>0</...),得先补全为完整格式,比如:<?xml version='1.0' encoding='utf-8' ?> <parameter> <name>max_amount</name> <label>Max Amount</label> <unit>Millions</unit> <component> <type>Combo</type> <attributes> <type>Integer</type> <displayed>4</displayed> <selected>0</selected> </attributes> </component> </parameter> - 第二步:生成XSD架构文件
打开Visual Studio,创建一个新的XML文件,把上面的完整XML粘贴进去,然后点击顶部菜单的XML → 创建架构,VS会自动生成对应的XSD文件,保存下来备用。 - 第三步:配置XML Source组件
- 在SSIS包的Data Flow任务中,拖入一个
XML Source组件 - 双击组件,在「Connection Manager」选项卡点击「New」,选择你的XML文件创建连接管理器
- 切换到「Columns」选项卡,点击「Browse」选择刚才生成的XSD文件,这时就能看到
<parameter>节点下的所有元素(包括嵌套的component、attributes子节点) - 勾选你需要加载到缓冲区的列,点击确定后,XML Source就会把这些列输出到数据流缓冲区,后续可以直接连接到目标组件使用
- 在SSIS包的Data Flow任务中,拖入一个
方法二:使用脚本组件(灵活自定义解析)
如果XML结构复杂或者需要额外的自定义逻辑,脚本组件会更灵活:
- 第一步:添加脚本源组件
在Data Flow任务中拖入一个脚本组件,选择「Source」类型(用来生成数据到缓冲区) - 第二步:配置输出列
双击脚本组件,切换到「Inputs and Outputs」选项卡,展开「Output 0」,点击「Add Column」添加你需要的列,比如:- name(字符串类型)
- label(字符串类型)
- unit(字符串类型)
- component_type(字符串类型)
- attributes_type(字符串类型)
- displayed(整数类型)
- selected(整数类型)
- 第三步:编写解析脚本(以C#为例)
点击「Edit Script」按钮,在CreateNewOutputRows方法中写入XML解析逻辑:
提示:如果XML内容来自SSIS变量,要在脚本组件的「Script」选项卡中,把变量添加到「ReadOnlyVariables」列表,然后用using System.Xml; public override void CreateNewOutputRows() { // 这里可以替换成XML文件路径,或者从SSIS变量读取(需在脚本配置中添加变量) string xmlContent = @"<?xml version='1.0' encoding='utf-8' ?> <parameter> <name>max_amount</name> <label>Max Amount</label> <unit>Millions</unit> <component> <type>Combo</type> <attributes> <type>Integer</type> <displayed>4</displayed> <selected>0</selected> </attributes> </component> </parameter>"; XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(xmlContent); // 获取根节点<parameter> XmlNode paramNode = xmlDoc.SelectSingleNode("/parameter"); if (paramNode != null) { // 新增一行数据到缓冲区 Output0Buffer.AddRow(); // 提取顶层元素 Output0Buffer.name = paramNode.SelectSingleNode("name")?.InnerText ?? string.Empty; Output0Buffer.label = paramNode.SelectSingleNode("label")?.InnerText ?? string.Empty; Output0Buffer.unit = paramNode.SelectSingleNode("unit")?.InnerText ?? string.Empty; // 提取嵌套的component节点内容 XmlNode componentNode = paramNode.SelectSingleNode("component"); if (componentNode != null) { Output0Buffer.component_type = componentNode.SelectSingleNode("type")?.InnerText ?? string.Empty; // 提取attributes节点内容 XmlNode attrsNode = componentNode.SelectSingleNode("attributes"); if (attrsNode != null) { Output0Buffer.attributes_type = attrsNode.SelectSingleNode("type")?.InnerText ?? string.Empty; // 处理整数类型,避免空值报错 int displayedVal; int.TryParse(attrsNode.SelectSingleNode("displayed")?.InnerText, out displayedVal); Output0Buffer.displayed = displayedVal; int selectedVal; int.TryParse(attrsNode.SelectSingleNode("selected")?.InnerText, out selectedVal); Output0Buffer.selected = selectedVal; } } } }Variables.YourVariableName获取变量值 - 第四步:运行数据流
保存脚本并关闭编辑器,运行Data Flow任务,脚本组件就会把解析后的所有元素加载到缓冲区中。
内容的提问来源于stack exchange,提问作者Save A.
相关产品推荐
相关产品推荐

