使用inno设置将节点添加到现有XML文件

时间:2011-11-19 13:00:18

标签: vb.net inno-setup

在我的inno设置脚本中有一个[code]部分,我需要添加一些代码:

  1. 打开xml文件
  2. 然后在特定位置添加单个节点
  3. 将文件保存回硬盘
  4. 我需要能够在\ documents \ docotype

    中编辑名为config.xml的文件

    在文件中有一些代码如下:

    <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 个答案:

答案 0 :(得分:3)

请参阅随新安装提供的CodeAutomation.iss example。并使用此代码代替“修改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 :(得分:1)

我认为你真的需要一些动态的方法来添加到这个配置文件,如果没有那么当然覆盖旧的是最简单的方法。

要动态地将部分添加到配置文件,您有一些选择:

  1. 您可以创建自己的命令行实用程序( exe 或脚本)来执行文件操作,并在安装脚本的[Run]部分中调用该实用程序。这看起来像这样:

    • [Files]部分,您的实用程序会有一行:

      来源:“myUtil.exe”; DestDir:“{app}”

    • [Run]部分,您需要为配置中的每个操作设置一行,如下所示:

      FileName:“{app} \ myUtil.exe”;参数:“/ addSection:”

  2. 您可以使用Pascal脚本来操作配置文件。您可以创建一个Pascal,使用CreateOleObject为文件操作调用msxml.dll XML。然后,在[Files]部分,您可以使用AfterInstall来调用您的Pascal函数,如下所示:

    Source: "myFileThatNeedsConfigManipulation.dll"; DestDir: ... ; 
        AfterInstall:  MyPascalFunctionThatDoesTheManipulation
    

答案 2 :(得分:0)

尝试这样的事情:

  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