2012-08-14 26 views
0

我正在研究一個DTS SSIS包並且打算使用Teamcity buildserver(通過Ruby/rake)......基本上我想爲每個環境(Dev,UAT,Prod)定製不同的連接字符串..DTS xml轉換/使用Ruby操作REXML

例如在測試中我想指向SQL2008Test,並在Dev SQL2008Dev中。這意味着我需要操縱我的dts包,然後才能將其部署到相應的目錄中......

任何人都有使用REXML的經驗 - ruby​​?

這是我的Ruby代碼(用Rake文件)

config = {} 
File.open(File.join(BUILD_SSIS_DIR, IRS_DSS_USER_PACKAGE)) do |config_file| 
    config = REXML::Document.new(config_file) 
ConfigTasks.set_dts_constring_irs config, 'ConnectionString', 
"Data Source=SQL2008DEV;Initial Catalog=IRSDEV;Provider=SQLNCLI10.1;Integrated Security=SSPI;Auto Translate=False;Application Name=SSIS-IRS DSS User Data Package-{3CC00FAB-7009-402D-AE03-2426AFC6B7ED}SQL2008 IRS Multiple Connection;" 
end 

並呼籲

def self.set_dts_constring_irs(config_file, name, connection_string) 
    conn_string_element = config_file.root.elements['DTS:ConnectionManager/DTS:Property']; 
    conn_string_element['DTS:Name="ConnectionString"'] = connection_string 
end 

這是我的DTS XML,我需要操縱

<DTS:ConnectionManager> 
    <DTS:Property DTS:Name="DelayValidation">0</DTS:Property> 
    <DTS:Property DTS:Name="ObjectName">SQL2008 IRS Multiple Connection</DTS:Property> 
    <DTS:Property DTS:Name="DTSID">{3CC00FAB-7009-402D-AE03-2426AFC6B7ED}</DTS:Property> 
    <DTS:Property DTS:Name="Description"></DTS:Property> 
    <DTS:Property DTS:Name="CreationName">OLEDB</DTS:Property><DTS:ObjectData><DTS:ConnectionManager> 
    <DTS:Property DTS:Name="Retain">0</DTS:Property> 
    <DTS:Property DTS:Name="ConnectionString">Data Source=SQL2008DEV;Initial Catalog=IRSDEV;Provider=SQLNCLI10.1;Integrated Security=SSPI;Auto Translate=False;Application Name=SSIS-IRS DSS User Data Package-{3CC00FAB-7009-402D-AE03-2426AFC6B7ED}SQL2008 IRS Multiple Connection;</DTS:Property> 
</DTS:ConnectionManager></DTS:ObjectData> 
</DTS:ConnectionManager> 

人有在我的工作方面的想法?例如如何使用REXML深入查看連接字符串的元素/屬性我需要?

回答

1

我假設您想使用REXML在XML文件中查找連接字符串,並用您自己的連接字符串替換它。 REXML可以讓你使用XPath找到一個元素,並設置它的值:

require 'rexml/document' 

# assuming: 
xml = '<DTS xmlns:DTS="www.microsoft.com/SqlServer/Dts"> 
     <DTS:ConnectionManager> 
      <DTS:Property DTS:Name="DelayValidation">0</DTS:Property> 
      <DTS:Property DTS:Name="ObjectName">SQL2008 IRS Multiple Connection</DTS:Property> 
      <DTS:Property DTS:Name="DTSID">{3CC00FAB-7009-402D-AE03-2426AFC6B7ED</DTS:Property> 
      <DTS:Property DTS:Name="Description"></DTS:Property> 
      <DTS:Property DTS:Name="CreationName">OLEDB</DTS:Property> 
      <DTS:ObjectData> 
      <DTS:ConnectionManager> 
       <DTS:Property DTS:Name="Retain">0</DTS:Property> 
       <DTS:Property DTS:Name="ConnectionString">Data Source=SQL2008DEV;Initial Catalog=IRSDEV;Provider=SQLNCLI10.1;Integrated Security=SSPI;Auto Translate=False;Application Name=SSIS-IRS DSS User Data Package-{3CC00FAB-7009-402D-AE03-2426AFC6B7ED}SQL2008 IRS Multiple Connection;</DTS:Property> 
      </DTS:ConnectionManager> 
      </DTS:ObjectData> 
     </DTS:ConnectionManager> 
     </DTS>' 

# find the connection string with XPath 
connection_string_xpath = '/DTS/DTS:ConnectionManager/DTS:ObjectData/DTS:ConnectionManager/DTS:Property[@DTS:Name="ConnectionString"]' 
new_connection_string = 'your new connection string here' 

begin 
    doc = REXML::Document.new(xml) 
    root = doc.root 
    # check that you can find the path you are looking for 
    unless root.elements[connection_string_xpath].nil? 
    # set the .text of the element to your connection string: 
    root.elements[connection_string_xpath].text = new_connection_string 
    # test: 
    puts doc 
    end 
rescue REXML::ParseException => rexml_exception 
    puts 'Invalid XML', rexml_exception 
end 

將輸出(一些XML刪除...):

... 
<DTS:Property DTS:Name='ConnectionString'>your new connection string here</DTS:Property> 
... 
+0

你真棒傢伙...好。我會做一些調整......所以現在XPATH位非常有意義! – kvrampage 2012-08-16 00:22:37