2011-09-01 84 views
0

我正在嘗試編寫一個簡短的安裝腳本來更新XML文件(myplatforinfo.config)中的值。在InstallScript中更新.config XML

我可恥偷了代碼[這篇文章在類似的任務] {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; 

但它倒下的負載方法,需要幫助!:

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> 

我只用2011的InstallShield作戰的時間很短,但我很快學會熱愛它的力量和恨它的發展的支持和缺乏清晰的用戶界面。任何幫助歡迎:)。

編輯:正如Michael Urman已經好心指出,我沒有正確處理從我的XML文檔加載布爾返回。我已經做了這個編輯,我的腳本現在得到了'getNamedItem'並設置了值。

這是否可能是因爲我想設置的字段不是指定的「值」屬性?我的元素沒有任何屬性,但我懷疑元素的值是一個名爲'value'的屬性,lol。我猜測錯了嗎?

進一步編輯!不,它不是上面那麼...我已經嘗試了node.Value和命名的元素路由,這兩種方式調試器崩潰在'setter'行爲新的價值。想想我可能只需要使用內置功能。

回答

2

我認爲你的負載檢查不正確。 DOMDocument.load方法的返回值是布爾值,而不是hresult。因此,而不是負值是失敗,只有零值是失敗。如果您將突出顯示的代碼摘錄與您引用的問題上的代碼進行比較,則會看到其他代碼使用if !successfulLoad代替。

但讓我們來澄清一些事情。當你從一個CreateObject調用的對象上進行操作時,你真的在​​使用COM而不是InstallScript,除非它是妨礙你做某事的語言方面。其次,如果單個ReplaceValueOf調用是您需要對此文件進行的唯一更改,並且您知道該文件位於(或將要)的位置,則使用內置XML文件可能會更容易改變支持。通過創建具有這些名稱的三個層次元素來設置其XPath以引用//platformID/SerialNumber/version,並將version元素的節點文本設置爲1

最近版本的InstallShield處理這樣的小改動非常好,只是在大批量修改時遇到排序問題和類似問題。如果縮進和其他此類更改導致問題,則也可以禁用該功能。

+0

這是一些很好的信息。我不是一個非常瞭解COM的人,所以沒有認出API,謝謝讓我知道在哪裏看,以及給我一些偉大的指針!我選擇InstallScript路由爲1.這部分是一個學習練習,它似乎是一個值得我在早期和第二週期間討論的重要特性。隨着應用程序的不斷髮展和編譯不同的版本,這將需要在未來擴展,我聽說腳本會給我最大的控制權。 – tigerswithguitars