如何使用的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扩展来保持它的声明性。我不喜欢写这些类型的自定义操作,因为它通常不会很好。
这是一个MSI类型 - 类型属性说 “基本MSI项目”。 不幸的是,升级到更新版本的InstallShield目前还不是我的选择,因此我将查看您关联的讨论和WiX中的Util扩展。谢谢克里斯托弗:) – 2010-11-09 17:11:59
哇,我知道你的名字听起来很熟悉 - 我已经结束了在Flexera论坛上阅读你的一些帖子,同时试图解决这些和以前的问题! – 2010-11-09 17:16:01
这很奇怪 - 当试图查看WiX 3手册中的几乎任何页面时,我所得到的只是一个空白内容部分,页面没有