我正在嘗試編寫一個簡短的安裝腳本來更新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'行爲新的價值。想想我可能只需要使用內置功能。
這是一些很好的信息。我不是一個非常瞭解COM的人,所以沒有認出API,謝謝讓我知道在哪裏看,以及給我一些偉大的指針!我選擇InstallScript路由爲1.這部分是一個學習練習,它似乎是一個值得我在早期和第二週期間討論的重要特性。隨着應用程序的不斷髮展和編譯不同的版本,這將需要在未來擴展,我聽說腳本會給我最大的控制權。 – tigerswithguitars