我使用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;
}
答案 0 :(得分:1)
是的,这只是打开一个XmlDocument
,找到一个特定节点并在再次保存文件之前更新其值。
代码是(未经测试,从内存中输入)
var xml = new XmlDocument();
xml.Load(szCryptomaticConfigFile);
var node = xml.SelectSingleNode(szXPath);
node.Value = CRYPTOMATIC_SETTINGS_VALUE
xml.Save(szCryptomaticConfigFile);
答案 1 :(得分:0)
.NET Framework的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)