Как обновить атрибуты в файле XML с помощью InstallScript

Вопрос:

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

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

Какие версии программного обеспечения?
Я использую InstallShield 11 в Windows Server 2003 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;    

person Nick Knowlson    schedule 09.11.2010    source источник


Ответы (1)


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

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

Обсуждение и пример можно найти на странице XML Installscript

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

Util Schema

person Christopher Painter    schedule 09.11.2010
comment
Это тип MSI - в свойстве Type указано «Базовый проект MSI». К сожалению, обновление до более новой версии InstallShield на данный момент для меня не вариант, поэтому я рассмотрю обсуждение, которое вы связали, и расширение Util в WiX. Спасибо, Кристофер :) - person Nick Knowlson; 09.11.2010
comment
Вау, я знал, что ваше имя звучит знакомо - я прочитал кучу ваших сообщений на форумах Flexera, пытаясь разобраться с этими и предыдущими проблемами, которые у меня были! - person Nick Knowlson; 09.11.2010
comment
Это странно - когда я пытаюсь просмотреть практически любую страницу в руководстве по WiX 3, все, что я получаю, - это пустой раздел содержимого без ‹title› для страницы. Навигация остается там, но похоже, что есть некоторые проблемы с отображением контента. Вы тоже это видите? Руководство WiX 2 показалось мне прекрасным. - person Nick Knowlson; 09.11.2010
comment
Я не знаю, что случилось с размещенной версией в наши дни. Я просто использую CHM, который поставляется с WiX, поскольку моя среда разработки все равно не подключена к Интернету. - person Christopher Painter; 09.11.2010
comment
Спасибо, что сообщили мне о CHM. Если кто-нибудь столкнется с этим позже, вы можете скачать WiX на своей странице CodePlex, здесь: wix .codeplex.com / Release / view / 44406 - person Nick Knowlson; 09.11.2010