我必须使用Inno Setup更新出现多次的XML节点。
怎么做?
例如:我必须更新while(grunt->hp > 0 && player->hp > 0)
个节点(虽然我不知道有多少个节点)
s.replaceAll("^-?\\d*\\.?\\d?=^/", " ")
谢谢
答案 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>