Как обновить атрибуты в файле XML с помощью InstallScript - PullRequest
2 голосов
/ 09 ноября 2010

Вопрос:

Я изо всех сил пытаюсь выяснить, как обновить некоторые атрибуты в файле XML с помощью InstallScript.Я хотел бы использовать правильные функции синтаксического анализа XML, но я не могу найти ничего, что предполагает, что эта версия InstallScript способна на это.Как я могу это сделать?Должен ли я просто попытаться использовать комбинацию FileInsertLine и FileGrep?Не хватает библиотеки?

Справочная информация:

Какие версии программного обеспечения?
Я использую InstallShield 11 на Windows Server2003 R2.

Почему я не просто использую существующую функцию «Изменения файлов XML»?
Поскольку я делаю обновление и сталкиваюсь с этой ошибкой ,Он влияет на функцию изменения файла XML, потому что он привязан к компоненту (ну, это мое предположение).Я слишком долго пробовал официальный обходной путь, но не мог уговорить его работать.В конце концов я обнаружил, что гораздо проще и надежнее копировать файлы, используя InstallScript + однострочный пакетный файл.Это кажется немного хакерским, но это то, что на самом деле работает.

Теперь я пытаюсь выяснить самый простой и самый простой для понимания способ спустя несколько лет воспроизвести эффекты XMLФункция изменения файла в InstallScript.

Пожалуйста, дайте мне знать, если вам нужна любая дополнительная информация, я буду рад предоставить ее.

РЕДАКТИРОВАТЬ:

В конце концов, я все-таки выбрал способ 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;    

1 Ответ

1 голос
/ 09 ноября 2010

Я помню, что XML-изменения в те дни были довольно глючными. Какой тип проекта вы используете? Если это тип MSI, я бы создал модуль слияния в WiX и использовал его шаблон XML-изменений. Затем вы можете добавить этот модуль слияния в ваш проект InstallShield.

Если вы действительно хотите сделать это в InstallScript, то вам придется использовать CoCreateObject () для вызова XML DOM.

Существует обсуждение и пример на XML Installscript

Но опять же, я бы так не поступил. Я либо обновил бы до новой версии InstallShield, либо использовал бы расширение Util в WiX, чтобы сохранить его декларативным. Мне не нравится писать эти типы пользовательских действий, поскольку обычно они плохо заканчиваются.

Util Schema

...