【问题标题】:How to update attributes in an XML file with InstallScript如何使用 InstallScript 更新 XML 文件中的属性
【发布时间】:2010-11-09 01:14:53
【问题描述】:

问题:

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

背景:

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

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

现在我正在尝试找出最简单和最容易在几年后弄清楚的方法来复制 InstallScript 中“XML 文件更改”功能的效果。

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

编辑:

我最终还是采用了 InstallScript 方式来完成它——它往往是这个安装程序项目中其他所有东西的实现方式,而且看起来(并且结果是)很快就可以完成。我从该线程中的代码shown by 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;    

【问题讨论】:

    标签: xml installshield installscript


    【解决方案1】:

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

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

    XML Installscript 有一个讨论和示例

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

    Util Schema

    【讨论】:

    • 这是一个 MSI 类型 - Type 属性显示“基本 MSI 项目”。不幸的是,此时升级到更新版本的 InstallShield 对我来说不是一个选项,所以我将看看您链接的讨论和 WiX 中的 Util 扩展。谢谢克里斯托弗:)
    • 哇,我知道你的名字听起来很熟悉 - 我最终在 Flexera 论坛上阅读了你的大量帖子,同时试图解决我遇到的这些问题和以前的问题!
    • 这很奇怪 - 当试图查看 WiX 3 手册中的几乎任何页面时,我得到的只是一个空白内容部分,页面没有 。导航保留在那里,但显示内容时似乎存在一些问题。你也在看这个吗? WiX 2 手册对我来说很好。
    • 我不知道这些天托管版本的情况如何。我只是使用 WiX 附带的 CHM,因为我的开发环境无论如何都没有连接到互联网。
    • 感谢您让我了解 CHM。如果以后有人遇到这个问题,可以在他们的 CodePlex 页面上下载 WiX,这里是:wix.codeplex.com/releases/view/44406
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 2011-07-17
    相关资源
    最近更新 更多