Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.09.2014, 09:28   #1
Oleg_SS
Пользователь
 
Регистрация: 02.04.2010
Сообщений: 75
По умолчанию Удаление узла в XML

Доброе время суток.
Подскажите как удалить узел в XML документе, если узлов с одинаковым названием несколько?
Как указать на нужный узел?

Например имеем такой XML-документ
Код:
<N1>
   <N2></N2>
   <N2></N2>
   <N2></N2>
</N1>
Надо удалить второй узел с именем N2

Этот код удаляет первый попавшийся узел с именем N2

Код:
var Node: IXMLNode;
begin
  Node := CurrNode.ParentNode;
  Node.ChildNodes.Delete('N2');
end;

Последний раз редактировалось Oleg_SS; 07.09.2014 в 09:31.
Oleg_SS вне форума Ответить с цитированием
Старый 07.09.2014, 10:17   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

С потолка: Это проход по списку элементов.
Код:
var Node,n: IXMLNode;
begin
  Node := CurrNode.ParentNode.FirstChild;
  repeat
   n:=Node.NextSibling;
   if Node.NodeName='N2' then node.ParentNode.RemoveChild(Node);
   Node:=n;
  until Node<>nil;
end;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.09.2014, 10:41   #3
Oleg_SS
Пользователь
 
Регистрация: 02.04.2010
Сообщений: 75
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
С потолка: Это проход по списку элементов.
Код:
var Node,n: IXMLNode;
begin
  Node := CurrNode.ParentNode.FirstChild;
  repeat
   n:=Node.NextSibling;
   if Node.NodeName='N2' then node.ParentNode.RemoveChild(Node);
   Node:=n;
  until Node<>nil;
end;
В результате удалится первый попавшийся, а мне надо удалить второй или третий.
Вообще задача стоит несколько сложнее. Имеем XML документ показанный в TreeView. Далее надо выделить в TreeView узел и удалить его. Таким образом мы не знаем заранее какой по счету узел нам надо удалить.
Oleg_SS вне форума Ответить с цитированием
Старый 07.09.2014, 10:52   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
В результате удалится первый попавшийся, а мне надо удалить второй или третий.
Че это так? По идее код должен удалить все вхождния.
Ну да ладно. Бог с ним.
Цитата:
Вообще задача стоит несколько сложнее.
По выделенному элементу в Трее получи его путь. Потом через XPath можно отсеять получив все по такому пути, и в цикле их поубирать.
Для выборки по XPath поможет метод selectNodes(). Примеры на форуме вроде были.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.09.2014, 11:11   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Можно просто при формировании TreeView записывать в него и указатели на IXMLNode (см. Data, да и методы есть соответствующие типа AddObject). Тогда в выделенном узле есть IXMLNode и нет проблем его удалить вместе с узлом
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 07.09.2014, 11:15   #6
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

А почему так?
Не проще ли использовать XML всего в двух местах программы?
1. Загрузка данных из XML файла с диска и построение дерева в TreeView.
2. Сохранение изменённых данных в XML на диск из памяти.
И кроме этих двух мест в программе не должно быть никаких TXMLDocument вообще.

Или я чего-то не понимаю?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 12.09.2014, 05:54   #7
Oleg_SS
Пользователь
 
Регистрация: 02.04.2010
Сообщений: 75
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Можно просто при формировании TreeView записывать в него и указатели на IXMLNode (см. Data, да и методы есть соответствующие типа AddObject). Тогда в выделенном узле есть IXMLNode и нет проблем его удалить вместе с узлом
А можно пример кода?
На сколько я понимаю при формировании TreeView записываем в него не только XML данные, но и ссылки на узлы XMLDocument.
1. как правильно записать ссылки?
2. как потом по этим ссылкам обратиться к узлу в XMLDocument для удаления/редактирования?

Последний раз редактировалось Oleg_SS; 12.09.2014 в 05:59.
Oleg_SS вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление узла из XML Oleg_SS Общие вопросы Delphi 7 18.08.2014 11:09
Удаление узла из дерева rafffkaaa Паскаль, Turbo Pascal, PascalABC.NET 0 19.05.2013 14:41
Как отследить удаление узла в TreeView Greek9000 Общие вопросы .NET 6 24.05.2011 07:58
Удаление узла из красно-черного дерева CodeNOT Общие вопросы C/C++ 0 18.05.2011 07:15