2

質問:

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;    
4

1 に答える 1

1

当時、XMLの変更はかなりバグが多かったことを思い出します。どのプロジェクトタイプを使用していますか?MSIタイプの場合は、WiXでマージモジュールを作成し、そのXML変更パターンを使用します。次に、そのマージモジュールをInstallShieldプロジェクトに追加できます。

本当にInstallScriptで実行したい場合は、CoCreateObject()を使用してXMLDOMを呼び出す必要があります。

XMLInstallscriptにdiscussinoと例があります

しかし、繰り返しますが、私はそれをこのようにはしません。InstallShieldの新しいバージョンにアップグレードするか、WiXのUtil拡張機能を利用して宣言型を維持します。これらのタイプのカスタムアクションを作成するのは、通常はうまく終了しないため、好きではありません。

Utilスキーマ

于 2010-11-09T13:14:06.023 に答える