Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Удаление строк из XML / 12 сообщений из 12, страница 1 из 1
09.08.2018, 12:05
    #39685390
Aqel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строк из XML
Есть xml ( конфиг .cfg ):
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<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"/>

- как это осуществить, глядел в сторону парсинга , но запутался в доску...

Вот наработка по поиску этих строк:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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); - этим хотел удалять



В мемо ничего не выводится...

Модератор: Как мне оформить свое сообщение?
...
Рейтинг: 0 / 0
09.08.2018, 12:11
    #39685403
goldmi45
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строк из XML
воспользуйтесь отладкой
...
Рейтинг: 0 / 0
09.08.2018, 12:13
    #39685406
Aqel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строк из XML
goldmi45,

Это где?
...
Рейтинг: 0 / 0
09.08.2018, 12:15
    #39685412
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строк из XML
Aqelглядел в сторону парсинга

зачем тебе парсить ? если текст строк у тебя фикесированный, без переменных???

1: http://docwiki.embarcadero.com/Libraries/Tokyo/en/System.IOUtils.TFile.ReadAllText
2: http://www.delphibasics.ru/StringReplace.php
3: http://docwiki.embarcadero.com/Libraries/Tokyo/en/System.IOUtils.TFile.WriteAllText
...
Рейтинг: 0 / 0
09.08.2018, 12:16
    #39685415
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строк из XML
goldmi45воспользуйтесь отладкой
AqelЭто где?

В мемориз! на башорг!
...
Рейтинг: 0 / 0
09.08.2018, 12:37
    #39685444
JayDi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строк из XML
Парсинг не нужно, хватит обычного TStringList'а с удалением лишнего:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
var
  sourceList: TStringList;
  destList: TStringList;
  fileName: string;
  I: Integer;
  s: string;
begin
  fileName := 'D:\test\install.ini';

  sourceList := TStringList.Create;
  destList := TStringList.Create;
  try    
    sourceList.LoadFromFile(fileName);
    
    for I := 0 to sourceList.Count - 1 do
    begin
      s := sourceList[I];
      if (s = '<file name="${{EulaHtmlFile}}"/>')
        or (s = '<file name="${{PrivacyPolicyFile}}"/>')
        or (s = '<file name="${{InstallerDllDirectory}}/NVI2UI.dll" core="true"/>') then
      begin
        // пропуск ненужных строк
        Continue;
      end;
      
      destList.Add(s);
    end;

    // результат пишем в тот же файл
    destList.SaveToFile(fileName);
  finally
    FreeAndNil(sourceList);
    FreeAndNil(destList);
  end;
end;
...
Рейтинг: 0 / 0
09.08.2018, 12:42
    #39685458
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строк из XML
JaDi,

хватит обычной string, никакие тут объекты не нужны, тем более тормознутый string list

тем более ты не обрабатываешь ситуацию нескольких тэгов в одной строке или пробелов до/после теэга
...
Рейтинг: 0 / 0
09.08.2018, 12:45
    #39685465
JayDi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строк из XML
Ariochтем более ты не обрабатываешь ситуацию нескольких тэгов в одной строке или пробелов до/после теэга
Этого в ТЗ не было :-) Тогда уж и пробелы внутри тегов можно добавить, которые string replace тоже не сможет обработать.
...
Рейтинг: 0 / 0
09.08.2018, 14:42
    #39685596
Aqel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строк из XML
Вот подсказали:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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;



Добавлю ваш try и всё пучком, всем спасибо!
...
Рейтинг: 0 / 0
09.08.2018, 18:28
    #39685704
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строк из XML
Aqel,

если упомянутые подстроки вдруг встретятся в какой-то другой строке кроме нужной....
в нескольких разных строках файла например...

но вам виднее
...
Рейтинг: 0 / 0
09.08.2018, 18:41
    #39685707
Aqel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строк из XML
Arioch,

Нет там одиночные строки ( которые надо удалить ) - повтора нет. Так, что мне подходить хоть и по простому варианту. Хотя мне ещё подкинули мыслишку по XML:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
uses msxml;  //подключить стандартный для windows XML парсер

var
  doc: IXMLDOMDocument;
  list: IXMLDOMNodeList;
  xml: IXMLDOMNode;
 
doc:=CoDOMDocument.Create; 
doc.Load('1.xml'); //загрузить документ
r:=doc.selectsingleNode(//file[@name="${{EulaHtmlFile}}"]) //это мы нашли что хотим удалить
p:=r.ParentNode; //для удаления нам нужен его родитель
p.RemoteChild(r);// и теперь спокойно удалим
...
doc.Save(....);



file name="${{EulaHtmlFile}}"/>,
найти и удалить
найти (далее "перевод" первой строки кода)
file ---узел с именем
// -- любой вложенности
@name ---с атрибутом name
= --имеющим
"${{EulaHtmlFile}}" ---заданное значение

сделаем по три строки для каждой из удаляемых
ИЛИ процедура из трех строк с параметром строка для удаления
+ по строке кода на каждое удаление
и потом сохранить.
...
Рейтинг: 0 / 0
09.08.2018, 20:22
    #39685757
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строк из XML
AqelНет там одиночные строки ( которые надо удалить ) - повтора нет

тогда самое простое - три команды и одна переменная

21635779
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Удаление строк из XML / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]