使用 XmlDocument 操作 SSIS 包
Manipulate SSIS Package Using XmlDocument
我正在将一个 SSIS 包从 2014 年降级到 2012 年。此过程需要一些 search/replace,我知道手动执行此操作。
现在我正在尝试编写一个 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 or XsltContext needed. This query has a prefix,
variable, or user-defined function
请指教
编辑:
我尝试在 Pkg14.SelectNodex 之前添加以下代码,但没有帮助:
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
确保将正确的 URL 映射到前缀(代码中的 DTS
前缀映射到与 XML 中不同的 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");
我正在将一个 SSIS 包从 2014 年降级到 2012 年。此过程需要一些 search/replace,我知道手动执行此操作。 现在我正在尝试编写一个 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 or XsltContext needed. This query has a prefix, variable, or user-defined function
请指教
编辑:
我尝试在 Pkg14.SelectNodex 之前添加以下代码,但没有帮助:
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
确保将正确的 URL 映射到前缀(代码中的 DTS
前缀映射到与 XML 中不同的 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");