質問:
InstallScriptを使用してXMLファイルのいくつかの属性を更新する方法を理解しようと苦労しています。適切なXML解析関数を使用したいのですが、このバージョンのInstallScriptがそれを実行できることを示唆するものは何も見つかりません。これどうやってするの?FileInsertLineとFileGrepの組み合わせにフォールバックする必要がありますか?不足しているライブラリはありますか?
バックグラウンド:
どのソフトウェアバージョンですか?
Windows Server2003R2でInstallShield11を使用しています。
既存の「XMLファイルの変更」機能を使用しないのはなぜですか?
私はアップグレードを行っていて、このバグに遭遇しているからです。コンポーネントに関連付けられているため、XMLファイル変更機能に影響します(まあ、それは私の推測です)。私は公式の回避策を試すのに時間がかかりすぎましたが、それをうまく機能させることができませんでした。最終的に、InstallScript+1行のバッチファイルを使用してファイルをコピーする方がはるかに簡単で信頼性が高いことがわかりました。少しハッキーな感じがしますが、実際に機能するものです。
今、私は、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;