如何使用InstallScript更新XML文件中的属性

时间:2010-11-09 01:14:53

标签: xml installshield installscript

问题:

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

背景

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

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

现在,我正在尝试找出最简单,最简单的数据,以便在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;    

1 个答案:

答案 0 :(得分:1)

我记得那些日子里的XML Changes很不错。您使用的是哪种项目类型?如果它是MSI类型,那么我将在WiX中创建一个合并模块并使用它的XML更改模式。然后,您可以将该合并模块添加到InstallShield项目中。

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

XML Installscript

上有一个讨论和示例

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

Util Schema