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

问题描述:

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

我竭力试图找出如何更新使用的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;  

我记得XML的变化是相当马车在那些日子。你使用什么项目类型?如果它是一个MSI类型,那么我会在WiX中创建一个合并模块并使用它的XML更改模式。然后,您可以将该合并模块添加到InstallShield项目中。

如果你真的想在InstallScript中做到这一点,那么你将不得不使用CoCreateObject()来调用XML DOM。

有一个discussino和例如在在XML Installscript

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

Util Schema

+0

这是一个MSI类型 - 类型属性说 “基本MSI项目”。 不幸的是,升级到更新版本的InstallShield目前还不是我的选择,因此我将查看您关联的讨论和WiX中的Util扩展。谢谢克里斯托弗:) – 2010-11-09 17:11:59

+0

哇,我知道你的名字听起来很熟悉 - 我已经结束了在Flexera论坛上阅读你的一些帖子,同时试图解决这些和以前的问题! – 2010-11-09 17:16:01

+0

这很奇怪 - 当试图查看WiX 3手册中的几乎任何页面时,我所得到的只是一个空白内容部分,页面没有

。导航停留在那里,但它看起来像显示内容的一些问题。你也看到了吗? WiX 2手册对我来说显得很好。 – <span class="text-secondary"> <small> <span>2010-11-09 17:27:21</span> </small> </span>