2

问题:

我正在努力弄清楚如何使用 InstallScript 更新 XML 文件中的某些属性。我想使用适当的 XML 解析函数,但我找不到任何表明此版本的 InstallScript 能够做到的东西。我怎样才能做到这一点?我是否应该尝试使用 FileInsertLine 和 FileGrep 的组合?有没有我想念的图书馆?

背景:

什么软件版本?
我在 Windows Server 2003 R2 上使用 InstallShield 11。

为什么我不只是使用现有的“XML 文件更改”功能?
因为我正在升级并遇到这个错误。它会影响 XML 文件更改功能,因为它与组件相关联(嗯,这是我的猜测)。我花了太长时间尝试官方的解决方法,但无法哄它工作。我最终发现使用 InstallScript + 单行批处理文件复制文件要容易得多,也更可靠。感觉有点hacky,但它确实有效。

现在,我试图找出最简单和最简单的方法来复制 InstallScript 中“XML 文件更改”功能的效果。

如果您需要更多信息,请告诉我,我很乐意提供。

编辑:

毕竟,我最终还是采用了 InstallScript 的方式来完成它——它往往是这个安装程序项目中其他所有东西的实现方式,而且看起来(并且结果是)很快就可以完成。我从TheTraveler在该线程中显示的代码开始,并对其进行了修改以满足我的需要。

这是代码:

prototype UpdateWebConfigAttributes();  
prototype ReplaceValueOf(OBJECT, STRING, STRING);   

function UpdateWebConfigAttributes()
    OBJECT oDoc, oNode;
    NUMBER i;                  
    STRING sWebConfigFilePath;   
    BOOL successfulLoad;
begin   

    sWebConfigFilePath = "Path\\To\\Web.config";  

    if Is(FILE_EXISTS, sWebConfigFilePath) = FALSE then
        MessageBox("Could not find Web.config file.", 0);
    endif;

    // get values from public properties
    set oDoc = CreateObject("Msxml2.DOMDocument.4.0");  
    if !IsObject(oDoc) then
        MessageBox("Could not create XML Document", 0);
        return -1;     
    endif;     

    oDoc.async = FALSE;  
    oDoc.setProperty("SelectionLanguage", "XPath");

    successfulLoad = oDoc.load(sWebConfigFilePath);
    if !successfulLoad then
        MessageBox("Could not load Web.config as an xml file", SEVERE);                         
        return -1;
    endif;

    ReplaceValueOf(oDoc, "//add[@key=\"ConnectionDriver\"]", CONNECT_DRIVER);
    ReplaceValueOf(oDoc, "//add[@key=\"ConnectionType\"]", CONNECT_TYPE);
    ReplaceValueOf(oDoc, "//add[@key=\"ConnectionString\"]", CONNECT_STRING_WEBCONFIG);
    ReplaceValueOf(oDoc, "//add[@key=\"ShowConnection\"]", "False");

    oDoc.save(sWebConfigFilePath);
    set oDoc = NOTHING;
end;   


function ReplaceValueOf(oDoc, xPath, valueToPutIn)
    OBJECT oNode;
begin
    set oNode = oDoc.selectNodes(xPath)(0);
    try
        oNode.attributes.getNamedItem("value").value = valueToPutIn;
    catch 
        MessageBox("Could not set '" + xPath + "' with '" + valueToPutIn + "'", SEVERE);
    endcatch;  
end;    
4

1 回答 1

1

我记得当时的 XML Changes 非常糟糕。您使用的是什么项目类型?如果它是 MSI 类型,那么我将在 WiX 中创建一个合并模块并使用它的 XML 更改模式。然后,您可以将该合并模块添加到您的 InstallShield 项目中。

如果您确实想在 InstallScript 中执行此操作,那么您将不得不使用 CoCreateObject() 来调用 XML DOM。

XML Installscript上有一个讨论和示例

但同样,我不会这样做。我要么升级到更新版本的 InstallShield,要么利用 WiX 中的 Util 扩展来保持它的声明性。我不喜欢编写这些类型的自定义操作,因为它通常不会很好地结束。

实用架构

于 2010-11-09T13:14:06.023 回答