问题:
我正在努力弄清楚如何使用 InstallScript 更新 XML 文件中的某些属性。我想使用适当的 XML 解析函数,但我找不到任何表明此版本的 InstallScript 能够做到的东西。我怎样才能做到这一点?我是否应该尝试使用 FileInsertLine 和 FileGrep 的组合?有没有我想念的图书馆?
背景:
什么软件版本?
我在 Windows Server 2003 R2 上使用 InstallShield 11。
为什么我不只是使用现有的“XML 文件更改”功能?
因为我正在升级并遇到这个错误。它会影响 XML 文件更改功能,因为它与组件相关联(嗯,这是我的猜测)。我花了太长时间尝试官方的解决方法,但无法哄它工作。我最终发现使用 InstallScript + 单行批处理文件复制文件要容易得多,也更可靠。感觉有点hacky,但它确实有效。
现在,我试图找出最简单和最简单的方法来复制 InstallScript 中“XML 文件更改”功能的效果。
如果您需要更多信息,请告诉我,我很乐意提供。
编辑:
毕竟,我最终还是采用了 InstallScript 的方式来完成它——它往往是这个安装程序项目中其他所有东西的实现方式,而且看起来(并且结果是)很快就可以完成。我从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;