使用XmlDocument操作SSIS包

本文关键字:SSIS 操作 XmlDocument 使用 | 更新日期: 2023-09-27 18:05:08

我正在将2014年的SSIS包降级到2012年。这个过程需要一些搜索/替换,我知道手动做到这一点。现在我正试着写一个c#程序来完成这项工作。

这是.DTSX文件中的XML。

<?xml version="1.0"?>
<DTS:Executable xmlns:DTS="www.microsoft.com/SqlServer/Dts"
  DTS:refId="Package"
  DTS:CreationDate="8/10/2016 11:39:29 AM"
  DTS:CreationName="Microsoft.Package"
  DTS:CreatorComputerName="FD89D67CEC21F"
  DTS:CreatorName="CORP'ZKHEKRZ"
  DTS:DTSID="{63B7F2FE-2D47-4710-82DF-83C92B7010B5}"
  DTS:ExecutableType="Microsoft.Package"
  DTS:LastModifiedProductVersion="12.0.4100.1"
  DTS:LocaleID="1033"
  DTS:ObjectName="CubeDailyBackup"
  DTS:PackageType="5"
  DTS:VersionBuild="131"
  DTS:VersionGUID="{8F0EAFC9-D73C-463C-8D5E-CB33C858D0D5}">
  <DTS:Property DTS:Name="PackageFormatVersion">8</DTS:Property>
  ....... more lines below 

第一步我需要替换

<DTS:Property DTS:Name="PackageFormatVersion">8</DTS:Property>

<DTS:Property DTS:Name="PackageFormatVersion">6</DTS:Property>

要完成这项工作,我使用XmlDocument加载.DTSX文件,然后使用下面的代码

查找节点
private XmlDocument Pkg14 = new XmlDocument();
Pkg14.Load("mypackage.dtsx");
XmlNodeList xnList = Pkg14.SelectNodes("//DTS:Property[@DTS:Name='PackageFormatVersion']");

执行第三行会抛出以下错误:

Namespace Manager或XsltContext需要。这个查询有一个前缀,变量或用户定义函数

请建议。编辑:

我尝试在Pkg14之前添加下面的代码。选择节点,但没有帮助:

    XmlNamespaceManager xmlnsManager = new XmlNamespaceManager(Pkg14.NameTable);
    xmlnsManager.AddNamespace("xs", "http://www.w3.org/2001/XMLSchema");
    xmlnsManager.AddNamespace("DTS", "www.microsoft.com/sqlserver/dts/tasks/webservicetask");
    ..... and adding more namespace

使用XmlDocument操作SSIS包

确保将正确的URL映射到前缀(代码中的DTS前缀映射到与XML中的URI不同的URI)。还要确保将XmlNamespaceManager和XPath查询一起传递给SelectNodes()SelectSingleNode()方法:

Pkg14.Load("mypackage.dtsx");
XmlNamespaceManager xmlnsManager = new XmlNamespaceManager(Pkg14.NameTable);
xmlnsManager.AddNamespace("xs", "http://www.w3.org/2001/XMLSchema");
xmlnsManager.AddNamespace("DTS", "www.microsoft.com/SqlServer/Dts");
XmlNode node = Pkg14.SelectSingleNode("//DTS:Property[@DTS:Name='PackageFormatVersion']", xmlnsManager);
node.InnerText = "6";
//save the modified XmlDocument back to file
Pkg14.Save("mypackage.dtsx");

dotnetfiddle demo