Inno Setup - 如何在特定行中保存节点

时间:2013-03-30 13:36:35

标签: xml inno-setup

我需要有关inno设置的帮助,我需要在特定行中保存一些xml节点,但我不知道如何。

这是我的代码

procedure SaveValueToXML(const AFileName, APath, AValue: string);
var
  XMLNode: Variant;
  XMLDocument: Variant;  
begin
  XMLDocument := CreateOleObject('Msxml2.DOMDocument.6.0');
  try
    XMLDocument.async := False;
    XMLDocument.load(AFileName);
//    if (XMLDocument.parseError.errorCode <> 0) then
//      MsgBox('Install the software. ' +
//        XMLDocument.parseError.reason, mbError, MB_OK)
//    else
    begin
      XMLDocument.setProperty('SelectionLanguage', 'XPath');
      XMLNode := XMLDocument.selectSingleNode(APath);
      XMLNode.text := AValue;
      XMLDocument.save(AFileName);
    end;
  except
    MsgBox('Install the software', mbError, MB_OK);
  end;
end;

function NextButtonClick(PageID: Integer): Boolean;
var
  XMLFile: string;
begin
  Result := True;
  if (PageId = wpFinished) then
  begin
    XMLFile := ExpandConstant('{pf}\Hell\0\Config.xml');
    if FileExists(XMLFile) then
    begin
      SaveValueToXML(XMLFile, '//@param', PEdit.Text);  //PEdit.text is from a custom input text box in the installer, ignore.
      SaveValueToXML(XMLFile, '//@path',
        ExpandConstant('{reg:HKCU\SOFTWARE\Craps,InstallPath}\Test.exe'));
    end;
  end;
end;

这是我的XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<stuffs>
        <stuff ident="555" path="C:\Program Files (x86)\Other thing\Other.exe" param="-alive" display="1" priority="0"/>
        <stuff ident="666" path="C:\Program Files (x86)\Craps\test.exe" param="-dead" display="1" priority="0"/>    
</stuffs>

问题是我的脚本总是写在第一行。我需要的是始终保存以<stuff ident="666"

开头的行中的节点

提前致谢!

1 个答案:

答案 0 :(得分:6)

您需要使用设置text属性的setAttribute方法。以下是修改节点属性值的过程:

procedure SaveAttributeValueToXML(const AFileName, APath, AAttribute, 
  AValue: string);
var
  XMLNode: Variant;
  XMLDocument: Variant;  
begin
  XMLDocument := CreateOleObject('Msxml2.DOMDocument.6.0');
  try
    XMLDocument.async := False;
    XMLDocument.load(AFileName);
    if (XMLDocument.parseError.errorCode <> 0) then
      MsgBox('The XML file could not be parsed. ' + 
        XMLDocument.parseError.reason, mbError, MB_OK)
    else
    begin
      XMLDocument.setProperty('SelectionLanguage', 'XPath');
      XMLNode := XMLDocument.selectSingleNode(APath);
      XMLNode.setAttribute(AAttribute, AValue);
      XMLDocument.save(AFileName);
    end;
  except
    MsgBox('An error occured!' + #13#10 + GetExceptionMessage, 
      mbError, MB_OK);  
  end;
end;

以下是如何查询ident参数值为666且其param属性值将更改为-alive的节点:

SaveAttributeValueToXML('d:\File.xml', '//stuffs/stuff[@ident=''666'']',
  'param', '-alive');

有关此处使用的XPath查询的详细信息,请参阅例如到this article