如何使用Inno Setup更新循环中的多个XML节点?

时间:2016-01-20 00:07:56

标签: xml inno-setup

我必须使用Inno Setup更新出现多次的XML节点。

怎么做?

例如:我必须更新while(grunt->hp > 0 && player->hp > 0) 个节点(虽然我不知道有多少个节点)

s.replaceAll("^-?\\d*\\.?\\d?=^/", " ")

谢谢

1 个答案:

答案 0 :(得分:2)

这是@TLama对How to read and write XML document node values?

的回答修改后的代码版本

除了他的代码,这个版本还可以更新与XPath匹配的多个节点。唯一的区别是调用selectNodes而不是selectSingleNode和以下for循环。

procedure SaveValueToXMLNodes(const AFileName, APath, AValue: string);
var
  XMLDocument: Variant;
  XMLNodeList: Variant;
  Index: Integer;
begin
  XMLDocument := CreateOleObject('Msxml2.DOMDocument.6.0');
  try
    XMLDocument.async := False;
    XMLDocument.load(AFileName);
    if XMLDocument.parseError.errorCode <> 0 then
    begin
      MsgBox('The XML file could not be parsed. ' +
        XMLDocument.parseError.reason, mbError, MB_OK)
    end
      else
    begin
      XMLDocument.setProperty('SelectionLanguage', 'XPath');
      XMLNodeList := XMLDocument.selectNodes(APath);
      for Index := 0 to XMLNodeList.length - 1 do
      begin
        XMLNodeList.item[Index].text := AValue;
      end;
      XMLDocument.save(AFileName);
    end;
  except
    MsgBox('An error occured!' + #13#10 + GetExceptionMessage, mbError, MB_OK);
  end;
end;

输入文件如:

<root>
    <server name="A">
        <details>id=5 gid=10</details>
    </server>
    <server name="B">
        <details>id=5 gid=10</details>
    </server>
</root>

您可以使用以下代码:

SaveValueToXMLNodes('servers.xml', '/root/server/details', 'id=6 gid=11');

得到:

<root>
    <server name="A">
        <details>id=6 gid=11</details>
    </server>
    <server name="B">
        <details>id=6 gid=11</details>
    </server>
</root>