Добавление узла в существующий XML-файл с использованием inno setup - PullRequest
0 голосов
/ 19 ноября 2011

В моем скрипте inno setup есть раздел [code], и ​​мне нужно добавить код:

  1. Открыть XML-файл
  2. затем добавить один узел в определенном месте
  3. Сохранить файл обратно на жесткий диск

Мне нужно иметь возможность редактировать файл с именем config.xml в \ documents \ docotype

в файле есть такой код:

<References>
  <ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <string>System.dll</string>
    <string>System.Core.dll</string>
    <string>System.Drawing.dll</string>
    <string>System.Windows.Forms.dll</string>
    <string>System.XML.dll</string>
  </ArrayOfString>
</References>

Мне нужно, чтобы это выглядело так:

<References>
  <ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <string>System.dll</string>
    <string>System.Core.dll</string>
    <string>System.Drawing.dll</string>
    <string>System.Windows.Forms.dll</string>
    <string>System.XML.dll</string>
    <string>C:\\bin\Custom\cutty109.dll</string>
  </ArrayOfString>
</References>

Так что на самом деле мне просто нужно добавить следующую строку в файл в разделе 'ArrayOfString'

<string>C:\\bin\Custom\cutty109.dll</string>

Я уверен, что это возможно, но я понятия не имею, как ..

Спасибо

Ответы [ 3 ]

3 голосов
/ 19 сентября 2012

Пожалуйста, обратитесь к CodeAutomation.iss примеру , предоставленному вместе с inno install.И используйте этот код вместо исходного кода в разделе «Изменение документа XML».

{ Modify the XML document }

  NewNode := XMLDoc.createElement('string');
  XMLDoc.setProperty('SelectionLanguage', 'XPath');
  RootNode := XMLDoc.selectSingleNode('//References/ArrayOfString');
  RootNode.appendChild (NewNode);
  RootNode.lastChild.text :='C:\\bin\Custom\cutty109.dll';

  { Save the XML document }
1 голос
/ 19 ноября 2011

Полагаю, вам действительно нужен какой-то динамический способ добавления в этот файл конфигурации, если нет, то, конечно, переопределение старого - самый простой способ.

Чтобы динамически добавлять разделы в файл конфигурации, у вас есть некоторыеОпции:

  1. Вы можете создать свою собственную утилиту командной строки ( exe или скрипт), которая выполняет манипуляции с файлами и вызывает эту утилиту в разделе [Run] вашегоустановить скрипт.Это может выглядеть примерно так:

    • В разделе [Files] у вас будет одна строка для вашей утилиты:

      Источник: "myUtil.exe";DestDir: "{app}"

    • В разделе [Run] у вас будет по одной строке для каждой манипуляции, которую вам нужно выполнить в вашей конфигурации, например:

      FileName: "{app} \ myUtil.exe";Параметры: "/ addSection:"

    ИЛИ

  2. Вы можете использовать сценарии Pascal для управления файлом конфигурации.Вы можете создать Паскаль, который использует CreateOleObject для вызова msxml.dll для XML манипулирования файлами.Затем в разделе [Files] вы можете использовать AfterInstall для вызова функции Pascal, например:

    Source: "myFileThatNeedsConfigManipulation.dll"; DestDir: ... ; 
        AfterInstall:  MyPascalFunctionThatDoesTheManipulation
    
0 голосов
/ 19 ноября 2011

Попробуйте что-то вроде этого:

  Dim sXPath : sXPath    = "/configuration/References/ArrayOfString"
  Dim sAdd   : sAdd      = "C:\\bin\Custom\cutty109.dll"
  Dim sElm   : sElm      = "string"
  Dim sFSpec : sFSpec    = resolvePath( "..\data\config.xml" )
  Dim oXDoc  : Set oXDoc = CreateObject( "Msxml2.DOMDocument" )
  oXDoc.setProperty "SelectionLanguage", "XPath"
  oXDoc.async = False
  oXDoc.load sFSpec

  If 0 = oXDoc.ParseError Then
     WScript.Echo sFSpec, "looks ok"
     Dim ndFnd : Set ndFnd = oXDoc.selectSingleNode( sXPath )
     If ndFnd Is Nothing Then
        WScript.Echo "|", sXPath, "| not found"
     Else
        WScript.Echo "found   |" & ndFnd.tagName & "|"
        Dim ndNew : Set ndNew = oXDoc.createElement( sElm )
        ndNew.appendChild oXDoc.createTextNode( sAdd )
        ndFnd.appendChild ndNew
        WScript.Echo "After appending:"
        WScript.Echo oXDoc.xml
        oXDoc.Save Replace( sFSpec, ".xml", "-2.xml" )
     End If
  Else
     WScript.Echo oXDoc.ParseError.Reason
  End If

Шаги:

  • создать Msxml2.DOMDocument
  • использовать XPath, чтобы найти узел для изменения
  • создайте строковый элемент now и добавьте текст
  • добавьте новый узел к найденному узлу
  • сохраните измененный XML
...