如何将此 InstallScipt 代码转换为 C#?
How can I convert this InstallScipt code to C#?
我正在使用 DTF(Microsoft 部署基础)命名空间将我的 InstallScript 自定义操作转换为托管自定义操作。有一段 InstallScript 代码在转换为 C# 时遇到了问题,我需要在其中执行一些 XML 文件操作。原始的 InstallScript 代码如下。我下面的代码是我到目前为止转换它的方式。有没有更好的转换方法,以便我可以利用点符号 (Intellisense) 而不是延迟绑定 XML 文档对象。
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;
}
是的,这只是打开一个 XmlDocument
,找到一个特定的节点并在再次保存文件之前更新它的值。
代码大致如下(未经测试,凭记忆输入)
var xml = new XmlDocument();
xml.Load(szCryptomaticConfigFile);
var node = xml.SelectSingleNode(szXPath);
node.Value = CRYPTOMATIC_SETTINGS_VALUE
xml.Save(szCryptomaticConfigFile);
.NET Framework 的 System.Xml.XmlDocument
object gives you the same behavior as the Microsoft.XMLDOM
COM objects, as described in 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);
需要注意的一件事是许多 load/save 选项都消失了。这些不再设置在顶层 XmlDocument
。相反,这些是用于保存和加载文档的 XmlTextReader
上的设置。默认情况下,Load()
方法是同步和验证的。通常这就是您想要的。
但是,如果您 XML 包含异地托管的 DTD 引用,并且解析这些 DTD 引用需要很长时间。这通常是 validateOnParse
被关闭的原因。如果您需要这样做,您需要使用重载的 Load
方法和您自己的 reader。您可以像这样关闭解析 DTD 引用的位:
var settings = new XmlReaderSettings();
settings.XmlResolver = null;
settings.ProhibitDtd = false;
var reader = XmlTextReader.Create(szCryptomaticConfigFile, settings);
xml.Load(reader)
我正在使用 DTF(Microsoft 部署基础)命名空间将我的 InstallScript 自定义操作转换为托管自定义操作。有一段 InstallScript 代码在转换为 C# 时遇到了问题,我需要在其中执行一些 XML 文件操作。原始的 InstallScript 代码如下。我下面的代码是我到目前为止转换它的方式。有没有更好的转换方法,以便我可以利用点符号 (Intellisense) 而不是延迟绑定 XML 文档对象。
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;
}
是的,这只是打开一个 XmlDocument
,找到一个特定的节点并在再次保存文件之前更新它的值。
代码大致如下(未经测试,凭记忆输入)
var xml = new XmlDocument();
xml.Load(szCryptomaticConfigFile);
var node = xml.SelectSingleNode(szXPath);
node.Value = CRYPTOMATIC_SETTINGS_VALUE
xml.Save(szCryptomaticConfigFile);
.NET Framework 的 System.Xml.XmlDocument
object gives you the same behavior as the Microsoft.XMLDOM
COM objects, as described in 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);
需要注意的一件事是许多 load/save 选项都消失了。这些不再设置在顶层 XmlDocument
。相反,这些是用于保存和加载文档的 XmlTextReader
上的设置。默认情况下,Load()
方法是同步和验证的。通常这就是您想要的。
但是,如果您 XML 包含异地托管的 DTD 引用,并且解析这些 DTD 引用需要很长时间。这通常是 validateOnParse
被关闭的原因。如果您需要这样做,您需要使用重载的 Load
方法和您自己的 reader。您可以像这样关闭解析 DTD 引用的位:
var settings = new XmlReaderSettings();
settings.XmlResolver = null;
settings.ProhibitDtd = false;
var reader = XmlTextReader.Create(szCryptomaticConfigFile, settings);
xml.Load(reader)