Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.RU > Delphi: Общие вопросы > Удаление строк в XML |
Автор: Aqel 09.08.18, 09:55 |
Есть xml (конфиг .cfg): <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> <?xml version="1.0" encoding="UTF-8"?> <setup title="${{ProductTitle}}"> ... <manifest> <file name="setup.exe" core="true"/> <file name="setup.cfg"/> <file name="eula.txt"/> <file name="${{EulaHtmlFile}}"/> <file name="${{FunctionalConsentFile}}"/> <file name="${{PrivacyPolicyFile}}"/> <file name="${{InstallerDllDirectory}}/NVI2.dll" core="true"/> <file name="${{InstallerDllDirectory}}/NvInstallerUtil.dll" core="true"/> <file name="${{InstallerDllDirectory}}/NVI2UI.dll" core="true"/> ... </manifest> </setup> Мне нужно удалить несколько строчек: <file name="${{EulaHtmlFile}}"/>, <file name="${{PrivacyPolicyFile}}"/>, <file name="${{InstallerDllDirectory}}/NVI2UI.dll" core="true"/> - как это осуществить, глядел в сторону парсинга, но запутался в доску... Вот наработка по поиску этих строк: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> var i: Integer; s: string; begin XMLDocument1.LoadFromFile('setup.cfg'); XMLDocument1.Active:= true; RootNode:= XMLDocument1.DocumentElement; for i:= 0 to RootNode.ChildNodes['manifest'].ChildNodes.Count - 1 do mmo1.Lines.Add(RootNode.ChildNodes['file'].ChildNodes[i].Text); //XMLDocument1.ChildNodes.Delete(i); - этим хотел удалять В мемо ничего не выводится... |
Автор: Fr0sT 14.08.18, 08:04 |
Самый простой и топорный вариант - читать построчно, искать вхождения, фильтровать. Если же идти через XML, то сначала читать про устройство формата и его объектную модель. Потому как приведенный код показывает, что ты в нем ни в зуб ногой. |
Автор: Aqel 14.08.18, 09:35 |
Цитата Fr0sT @ Это точно... Вот мне помогли: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> procedure TForm1.Button1Click(Sender: TObject); const A: array [1..3] of String = ('EulaHtmlFile', 'PrivacyPolicyFile', 'NVI2UI.dll'); var i, j: integer; L: TStringList; begin L := TStringList.Create; L.LoadFromFile('setup.cfg'); for i := L.Count - 1 downto 0 do for j := 1 to 3 do if Pos(A[j], L.Strings[i]) > 0 then begin L.Delete(i); break; end; L.SaveToFile('setup.cfg'); L.Free; end; |
Автор: Profi 22.08.18, 10:36 |
Aqel, задам пару наводящих вопросов, что помогут улучшить твой код: |
Автор: Aqel 22.08.18, 17:10 |
Поясню: - Каждый раз можно и не проверять (лишние циклы и время) эти значения (они только один раз встречаются в этом файле). - Эти строки всегда находятся в конце .xml(.cfg) файла и находятся рядом (друг за другом или через одну строчку). ..думаю так яснее?.. |
Автор: Profi 22.08.18, 17:40 |
Цитата Aqel @ Поясню: - Каждый раз можно и не проверять (лишние циклы и время) эти значения (они только один раз встречаются в этом файле). - Эти строки всегда находятся в конце .xml(.cfg) файла и находятся рядом (друг за другом или через одну строчку). ..думаю так яснее?.. Ну и как тогда должен выглядеть код? |