2016-09-01 41 views
2

我将2014年到2012年的SSIS包降级。这个过程需要一些搜索/替换,我知道要手动完成。 现在我正在尝试编写一个C#程序来完成这项工作。使用XmlDocument操纵SSIS包

这是.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 

回答

1

请确保您有映射到前缀正确的URL(在DTS前缀您代码映射到与XML中不同的URI)。另外,还要确保你的XPath查询一起传递给XmlNamespaceManagerSelectNodes()方法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

+0

感谢您的回答!我需要一个提示。我将会有大量的“SelectNodes”,我如何避免为每个单独的调用传递xmlnsManager?我试图将xmlnsManager设置为Pkg14.XmlResolver,但得到编译错误。任何想法? – FLICKER