Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.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, задам пару наводящих вопросов, что помогут улучшить твой код:
  1. Зачем проверять все три значения каждый раз, когда одно или несколько уже были использованы для удаления (при условии, что строки встречаются всего по разу, разумеется)?
  2. Зачем дальше проверять файл, если все три строки уже удалены (при том же условии, что и выше)?

Автор: Aqel 22.08.18, 17:10
Цитата Profi @
Aqel, задам пару наводящих вопросов, что помогут улучшить твой код:
  1. Зачем проверять все три значения каждый раз, когда одно или несколько уже были использованы для удаления (при условии, что строки встречаются всего по разу, разумеется)?
  2. Зачем дальше проверять файл, если все три строки уже удалены (при том же условии, что и выше)?

Поясню:
- Каждый раз можно и не проверять (лишние циклы и время) эти значения (они только один раз встречаются в этом файле).
- Эти строки всегда находятся в конце .xml(.cfg) файла и находятся рядом (друг за другом или через одну строчку).
..думаю так яснее?.. :rolleyes:

Автор: Profi 22.08.18, 17:40
Цитата Aqel @
Цитата Profi @
Aqel, задам пару наводящих вопросов, что помогут улучшить твой код:
  1. Зачем проверять все три значения каждый раз, когда одно или несколько уже были использованы для удаления (при условии, что строки встречаются всего по разу, разумеется)?
  2. Зачем дальше проверять файл, если все три строки уже удалены (при том же условии, что и выше)?

Поясню:
- Каждый раз можно и не проверять (лишние циклы и время) эти значения (они только один раз встречаются в этом файле).
- Эти строки всегда находятся в конце .xml(.cfg) файла и находятся рядом (друг за другом или через одну строчку).
..думаю так яснее?.. :rolleyes:

Ну и как тогда должен выглядеть код?

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)