如何用C#脚本组件调整Task Factory生成的XML根节点命名空间前缀
解决XML命名空间前缀修改的C#脚本方案
我明白你要搞定的问题——把Task Factory输出的默认命名空间XML,改成带CSDS前缀的命名空间格式,同时根元素要变成<CSDS:CSDS>。用C#的System.Xml.Linq(LINQ to XML)就能完美解决,我给你写个可以直接在SSIS脚本组件里用的示例:
完整代码示例
using System; using System.Xml.Linq; using Microsoft.SqlServer.Dts.Runtime; public class ScriptMain { public void Main() { // 1. 获取Task Factory输出的原XML内容 // 这里假设你已经把原XML存到了SSIS变量里,也可以直接读取文件 string originalXml = Dts.Variables["User::OriginalXml"].Value.ToString(); // 2. 加载XML到XDocument对象 XDocument xmlDoc = XDocument.Parse(originalXml); // 3. 定义目标命名空间URI XNamespace csdsNamespace = "http://www.datadictionary.nhs.uk/messages/CSDS-v1-0"; // 4. 修改根元素名称:将默认命名空间下的"CSDS"改为带命名空间关联的"CSDS:CSDS" xmlDoc.Root.Name = csdsNamespace + "CSDS"; // 5. 替换命名空间声明:移除默认无前缀的命名空间,添加带CSDS前缀的声明 // 先删除原来的默认命名空间属性 xmlDoc.Root.Attributes() .Where(attr => attr.IsNamespaceDeclaration && attr.Value == csdsNamespace.ToString()) .Remove(); // 添加新的前缀命名空间声明 xmlDoc.Root.Add(new XAttribute(XNamespace.Xmlns + "CSDS", csdsNamespace)); // 6. 输出修改后的XML到SSIS变量或者直接写入文件 string modifiedXml = xmlDoc.ToString(SaveOptions.OmitDuplicateNamespaces); Dts.Variables["User::ModifiedXml"].Value = modifiedXml; // 如果要直接写入文件,替换成下面的代码 // xmlDoc.Save(@"C:\YourOutputPath\ModifiedCSDS.xml"); Dts.TaskResult = (int)DTSExecResult.Success; } }
代码说明
- 命名空间保留:我们完全保留了原有的命名空间URI,只是把默认的无前缀声明改成了带
CSDS前缀的形式,保证XML的语义不变 - 根元素重命名:通过给根元素名称绑定命名空间,自动实现
<CSDS:CSDS>的格式,无需手动拼接字符串 - SSIS适配:代码用SSIS变量传递原XML和输出结果,你可以根据自己的实际场景调整(比如直接读取Task Factory生成的XML文件)
- 去重优化:用
SaveOptions.OmitDuplicateNamespaces确保输出的XML不会出现多余的命名空间声明,保持结构整洁
运行这段代码后,你就能得到想要的XML格式:
return (<CSDS:CSDS xmlns:CSDS="http://www.datadictionary.nhs.uk/messages/CSDS-v1-0"> <CYP000> <C000010>1.0</C000010> </CYP000> </CSDS:CSDS> )
内容的提问来源于stack exchange,提问作者mhep
相关产品推荐
相关产品推荐

