2015-02-24 73 views
0

我使用DTF(Microsoft部署基礎)命名空間將我的InstallScript自定義操作轉換爲託管自定義操作。有一段InstallScript代碼,我在轉換到C#時遇到了麻煩,因爲我需要執行一些XML文件操作。原始的InstallScript代碼如下。我的代碼下面是我迄今爲止如何轉換它。有沒有更好的方法來轉換它,以便我可以利用點符號(Intellisense)而不是使XML文檔對象遲到。如何將此InstallScipt代碼轉換爲C#?

set oDoc = CoCreateObject("Microsoft.XMLDOM"); 
    if (IsObject(oDoc)) then 
     oDoc.async = FALSE; 
     oDoc.validateOnParse = FALSE; 
     oDoc.resolveExternals = FALSE; 
     oDoc.preserveWhiteSpace = VARIANT_TRUE; 

     oDoc.load(szCryptomaticConfigFile); 

     szXPath = CRYPTOMATIC_SETTINGS_PATH; 
     set oSettingsNode = oDoc.selectSingleNode(szXPath); 

     szValue = CRYPTOMATIC_SETTINGS_VALUE; 
     oSettingsNode.nodeTypedValue = szValue; 

     oDoc.Save(szCryptomaticConfigFile); 
    endif; 

我的轉換

 dynamic oXMLDOMDoc = Activator.CreateInstance(Type.GetTypeFromProgID("Microsoft.XMLDOM")); 
     if (oXMLDOMDoc != null) 
     { 
      oXMLDOMDoc.async = false; 
      oXMLDOMDoc.validateOnParse = false; 
      oXMLDOMDoc.preserveWhiteSpace = VARIANT_TRUE; 
      oXMLDOMDoc.load(szCryptomaticConfigFile); 

      string szXPath = CRYPTOMATIC_SETTINGS_PATH; 
      dynamic oSettingsNode = oXMLDOMDoc.selectSingleNode(szXPath); 

      string szXValue = CRYPTOMATIC_SETTINGS_VALUE; 
      oSettingsNode.nodeTypedValue = szXValue; 

      oXMLDOMDoc.Save(szCryptomaticConfigFile); 
      return ActionResult.Success; 
     } 
     else 
     { 
      return ActionResult.Failure; 
     } 
+0

您可以使用'XmlSerializer'將XML序列化爲和來自.NET對象的序列化。您有時需要將屬性應用於您的類,才能獲得完整的XML,但這非常有效。 – 2015-02-24 11:47:23

+0

我懷疑這與將我從InstallScript(InstallShield自定義操作)轉換爲.NET(C#)的過程相同。但是,謝謝你的建議。 – GhostHunterJim 2015-02-24 11:55:22

+0

事實上它不會 - 根據答案使用「XmlDocument」在這裏更合適 – 2015-02-24 11:58:38

回答

1

是的,這簡直是打開一個XmlDocument,找到一個特定節點,並再次保存文件之前更新其價值。

的代碼是沿着線(未經測試,從存儲器鍵入)

var xml = new XmlDocument(); 
xml.Load(szCryptomaticConfigFile); 
var node = xml.SelectSingleNode(szXPath); 
node.Value = CRYPTOMATIC_SETTINGS_VALUE 
xml.Save(szCryptomaticConfigFile); 
+0

感謝您的幫助。我無法找到InstallScript代碼中使用的相同屬性,例如Async。 ValidateOnParse等。我曾嘗試添加對Microsoft.MSXML的引用,並添加了使用MSXML,它允許我訪問Async屬性,但其他人不在那裏。 – GhostHunterJim 2015-02-24 11:53:54

+0

@Jamiec啊哈!我想我找到了它。 :)我需要使用Microsoft.MSXML中的DOMDocument類對象。謝謝。你的建議讓我思考。 – GhostHunterJim 2015-02-24 12:00:15

+0

@MichaelEdenfield我只是試圖使用XMLDocument對象,我正在尋找的屬性不存在。 – GhostHunterJim 2015-02-24 12:17:22

0

.NET框架的System.Xml.XmlDocument對象給你相同的行爲Microsoft.XMLDOM COM對象,如在this MSDN article說明。

在這種情況下,您的代碼會是這個樣子:

var xml = new XmlDocument(); 
xml.PreserveWhiteSpace = true; 
xml.Load(szCryptomaticConfigFile); 

string szXPath = CRYPTOMATIC_SETTINGS_PATH; 
var settingsNode = xml.selectSingleNode(szXPath); 

string szXValue = CRYPTOMATIC_SETTINGS_VALUE; 
settingsNode.InnerText = szXValue; 

xml.Save(zzCryptomaticConfigFile); 

有一點要注意的是,很多的加載/保存選項都沒有了。這些不再設置在頂層XmlDocument上。相反,這些是用於保存和加載文檔的XmlTextReader上的設置。默認情況下,Load()方法是同步並驗證的。通常這是你想要的。

但是,如果XML包含非站點託管的DTD引用,並且解決這些DTD引用需要很長時間。這通常是爲什麼validateOnParse被關閉。如果您需要這樣做,則需要使用自己的閱讀器使用超載Load方法。您可以關閉解析DTD參考的位,如下所示:

var settings = new XmlReaderSettings(); 
settings.XmlResolver = null; 
settings.ProhibitDtd = false; 

var reader = XmlTextReader.Create(szCryptomaticConfigFile, settings); 
xml.Load(reader) 
+0

謝謝!我也會試一試。 – GhostHunterJim 2015-02-24 12:02:27