0

我正在使用 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;
        }
4

2 回答 2

1

是的,这只是打开一个XmlDocument,找到一个特定的节点并在再次保存文件之前更新它的值。

代码类似于(未经测试,从内存中键入)

var xml = new XmlDocument();
xml.Load(szCryptomaticConfigFile);
var node = xml.SelectSingleNode(szXPath);
node.Value = CRYPTOMATIC_SETTINGS_VALUE
xml.Save(szCryptomaticConfigFile);
于 2015-02-24T11:47:29.127 回答
0

.NET Framework 的对象为您提供与COM 对象System.Xml.XmlDocument相同的行为,如此 MSDN 文章中所述。Microsoft.XMLDOM

在这种情况下,您的代码将如下所示:

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)
于 2015-02-24T11:54:40.097 回答