Я повинен оновити вузол 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>