Обновление .config XML в InstallScript - PullRequest
0 голосов
/ 01 сентября 2011

Я пытаюсь написать короткий скрипт установки для обновления значения в XML-файле (myplatforinfo.config).

Я постыдно украл код из [этого поста по аналогичной задаче] {/2827400/kak-obnovit-atributy-v-faile-xml-s-pomoschy-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>

Я только некоторое время боролся с InstallShield 2011, но я быстро учусь любить его мощь и ненавижу его поддержку разработки иотсутствие четкого интерфейса.Любая помощь приветствуется :).

РЕДАКТИРОВАТЬ: Как Майкл Урман любезно указал, я не правильно обрабатывал логическое возвращение из моей загрузки документа XML.Я сделал это редактирование, и мой сценарий теперь доходит до 'getNamedItem' и устанавливаю значение.

Возможно ли это потому, что поле, которое я хочу установить, не является именованным атрибутом "value"?Мои элементы не имеют каких-либо атрибутов, но я подозревал, что значением для элемента был атрибут с именем 'value', lol.Я предположил, что неправильно?

Дальнейшее редактирование!Нет, тогда это не так ... Я попробовал node.Value и маршрут именованного элемента, так как оба пути отладчика дают сбой в строке 'setter' для нового значения.Думаю, мне может понадобиться встроенная функция.

1 Ответ

2 голосов
/ 01 сентября 2011

Я думаю, что ваша проверка нагрузки неверна. Возвращаемое значение метода DOMDocument.load - логическое, а не hresult. Таким образом, вместо отрицательных значений, являющихся ошибками, только нулевое значение является ошибкой. Если вы сравните выделенную выдержку из кода с кодом вопроса, на который вы ссылаетесь, вы увидите, что другой код использует if !successfulLoad вместо.

Но давайте также проясним несколько вещей. Когда вы выполняете операции над объектом из вызова CreateObject, вы действительно боретесь с COM вместо InstallScript, если только языковая сторона не мешает вам что-либо делать.

Во-вторых, если единственный вызов ReplaceValueOf - это единственное изменение, которое необходимо внести в этот файл, и вы знаете, где находится файл (или будет), вероятно, будет гораздо проще использовать встроенные изменения файла XML служба поддержки. Настройте его XPath так, чтобы он ссылался на //platformID/SerialNumber/version, создав три иерархических элемента с этими именами, и установите для текста узла version элемента значение 1.

Последние версии InstallShield очень хорошо справляются с небольшими изменениями, такими как эта, только с проблемами при заказе и аналогичными при крупных оптовых изменениях. Если отступы и другие подобные изменения вызывают проблемы, вы также можете отключить их.

...