问题:
我正在努力弄清楚如何使用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;
答案 0 :(得分:1)
我记得那些日子里的XML Changes很不错。您使用的是哪种项目类型?如果它是MSI类型,那么我将在WiX中创建一个合并模块并使用它的XML更改模式。然后,您可以将该合并模块添加到InstallShield项目中。
如果您确实希望在InstallScript中执行此操作,那么您将不得不使用CoCreateObject()来调用XML DOM。
上有一个讨论和示例但是,我不会这样做。我要么升级到较新版本的InstallShield,要么利用WiX中的Util扩展来保持声明。我不喜欢编写这些类型的自定义操作,因为它通常不会很好地结束。