2016-09-01 4 views
2

SSIS 패키지를 2014 년에서 2012 년으로 다운 그레이드해야합니다.이 프로세스는 검색/바꾸기가 필요하며 수동으로 수행해야합니다. 이제 작업을 수행하는 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에 매핑 된 코드). 또한이 SelectNodes() 또는 SelectSingleNode() 방법 XPath 쿼리와 함께 XmlNamespaceManager을 통과해야합니다 :

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