0

XML ファイル (myplatforinfo.config) の値を更新する短いインストール スクリプトを作成しようとしています。

[同様のタスクに関するこの投稿]{http://stackoverflow.com/questions/4129633/how-to-update-attributes-in-an-xml-file-with-installscript} から恥ずべきコードを盗みましたが、私のニーズのためにそれをハッキングしました。

/// <summary>
/// This function reads in the fddId.config and alters the number associated
/// with the serial number fo the installed package.
/// <summary>
function UpdateDeviceFirmwareVersion(hMSI)
    OBJECT oDoc;       
    STRING sConfigFilePath;   
    BOOL successfulLoad;
    NUMBER retVal;
begin   
    sConfigFilePath = "C:\\myplatforinfo.config"; 
    retVal = 0;

    if (Is(FILE_EXISTS, sConfigFilePath)) = FALSE then
        MessageBox("Could not find fddId file.", 0);
        retVal = -1;
    endif;

    // get values from public properties
    set oDoc = CreateObject("Msxml2.DOMDocument.4.0");  
    if (!IsObject(oDoc)) then
        MessageBox("Could not create XML Document", 0);
        retVal = -1;
    endif;     

    oDoc.async = FALSE;  
    oDoc.setProperty("SelectionLanguage", "XPath");

    successfulLoad = oDoc.load(sConfigFilePath);
    if (successfulLoad < 0) then
        MessageBox("Could not load the fddId as an xml file", SEVERE);
        retVal = -1;                
    endif;

    if (retVal = -1) then
        return retVal;
        abort;
    endif;

    ReplaceValueOf(oDoc, "//platformID/SerialNumber/version", "1");

    oDoc.save(sConfigFilePath);
    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;  

ただし、load メソッドでフォールオーバーしています。助けが必要です!:

successfulLoad = oDoc.load(sConfigFilePath);
if (successfulLoad < 0) then
MessageBox("Could not load the fddId as an xml file", SEVERE);
retVal = -1;                
endif;

理由はわかりません。このファイルは有効な XML ファイルであり、それを使用する .Net コードによって問題なく処理されます。以下に、XML 構成ファイルの単純化されたバージョンを含めました。使用されるヘッダーとタグのみですが、構造は同じです。コメントが含まれていますが、これは InstallShield パーサーに影響しますか?

<?xml version="1.0" encoding="utf-8"?>
<platformIDxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <type>35</type>
  <manufacturer>14</manufacturer>
  <SerialNumber>
    <version>2</version>
  </SerialNumber>
</platformID>

私は InstallShield 2011 と戦ってまだ少ししか経っていませんが、そのパワーを愛し、開発サポートと明確な UI の欠如を嫌うことを急速に学んでいます。どんな助けでも歓迎します:)。

編集: Michael Urman が親切に指摘したように、XML ドキュメントの読み込みからのブール値の戻り値を正しく処理していませんでした。私はこの編集を行い、スクリプトは「getNamedItem」まで取得して値を設定しています。

これは、設定したいフィールドが名前付きの「値」属性ではないためでしょうか? 私の要素には属性がありませんが、要素の値は「値」という名前の属性であると思われました (笑)。私は間違っていると思いましたか?

さらに編集!! いいえ、それは上記ではありません... node.Value と名前付き要素ルートを試しましたが、どちらの方法でもデバッガーは新しい値の「セッター」行でクラッシュします。組み込み関数を使用する必要があるかもしれないと思います。

4

2 に答える 2

2

ロードチェックが間違っていると思います。DOMDocument.loadメソッドの戻り値はブール値であり、hresultではありません。したがって、負の値が失敗である代わりに、ゼロ値のみが失敗です。強調表示されたコードの抜粋を、参照している質問のコードと比較すると、代わりに他のコードが使用していることがわかりますif !successfulLoad

しかし、いくつかのことも明確にしましょう。CreateObject呼び出しからオブジェクトの操作を実行する場合、何かを行うのを妨げているのが言語側でない限り、InstallScriptではなくCOMと実際に戦っています。

次に、単一のReplaceValueOf呼び出しがこのファイルに加える必要のある唯一の変更であり、ファイルがどこにあるか(またはどこにあるか)がわかっている場合は、組み込みのXMLファイル変更サポートを使用する方がはるかに簡単です。//platformID/SerialNumber/versionそれらの名前で3つの階層要素を作成することにより、参照するXPathを設定し、version要素のノードテキストをに設定します1

InstallShieldの最近のバージョンは、このような小さな変更をかなりうまく処理しますが、大規模な大規模な変更では注文などの問題が発生するだけです。インデントなどの変更によって問題が発生している場合は、それを無効にすることもできます。

于 2011-09-01T12:23:00.453 に答える