/ / Як оновити кілька вузлів XML у циклі з Inno Setup? - xml, inno-setup

Як оновити кілька вузлів XML у циклі за допомогою програми Inno Setup? - xml, inno-setup

Я повинен оновити вузол XML, який з'являється кілька разів, використовуючи Inno Setup.

Як це зробити?

Наприклад: я повинен оновити <details> вузли (поки я не знаю, скільки вузлів існує)

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

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

Дякую

Відповіді:

2 для відповіді № 1

Це модифікована версія коду від @TLama з відповіді на Як читати та писати значення XML-документа?

Крім його коду, ця версія може оновлювати кілька вузлів, які відповідають 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>