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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.12.2014, 16:34   #1
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
Вопрос Копирование нода и добавление его в родительский

Добрый день.
Есть xml-документ. Как скопировать нужный узел и добавить его к родительскому. Пример: скопировать строку таблицы.
При вызове метода TXMLNode.NodeAdd() выскакивает AV. В ее сырцах просто генерируется эксепшн. Натолкните плиз на верную мысль. Гуглил, про корректное копирование нодов не нашел ничего.
Использую NativeXML.
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 26.12.2014, 16:44   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

CloneNode - копировать узел с дочерними
Insert - вставить его
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 29.12.2014, 08:58   #3
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

NodeInsert() есть, а вот NodeClone() не наблюдается.
Версия NativeXml 4.07
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 29.12.2014, 09:10   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
а вот NodeClone() не наблюдается.
ещё внимательнее....
Цитата:
CloneNode - копировать узел с дочерними
Человек_Борща вне форума Ответить с цитированием
Старый 29.12.2014, 10:00   #5
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Может я что-то не понимаю?
Screenshot_1.jpg
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 29.12.2014, 10:47   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Использую NativeXML
Упс. Эту строку не дочитал, извиняюсь Методы привел для родного парсера XMLDocument
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 30.12.2014, 09:57   #7
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Может плохо рою гугл, но так и не нашел возможности копирования узла.
Возможно, тривиально тоже верно:
Код:
LNewNode:=TXmlNode.Create(nil);
LNode.Assign(LNewNode);
Или же метод CopyFrom()? Но в его исходниках все сводится к проверке входного параметра на тип и вызов очистки узла.
Вопрос остается актуальным. Кто делал такое, отпишитесь плиз.
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 30.12.2014, 11:40   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А типа такого:
Код:
var xNodes: array of TXmlNode;

  SetLength(xNodes,1);
  xNodes[0]:=LNode;
  LNode.Parent.NodesAdd(xNodes);
Или просто NodeAdd
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 30.12.2014 в 12:03.
Аватар вне форума Ответить с цитированием
Старый 13.01.2015, 10:24   #9
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Разобрался с проблемой. Все просто. Расскажу, может кому-то пригодится:
Смотрим исходники, метод NodeAdd():
Код:
function TXmlNode.NodeAdd(ANode: TXmlNode): integer;
begin
  // functionality is in descendant TsdContainerNode
  raise Exception.Create(sCannotAddNode);
end;
Обращая внимание на комментарий, копирование нода в родителя можн сделать с помощью тайпкаста:
Код:
TsdContainerNode(LNode.Parent).NodeAdd(LNode);
Аналогично с методами NodesAdd(), NodeInsert().
Все заработало. Тему можно закрывать. Всем спасибо.
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 13.01.2015, 11:06   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А вот Parent и есть TsdContainerNode, другим и не может быть и LNode.Parent.NodesAdd у меня прекрасно отработал без приведения типа поскольку и вызывается в цикле переопределенный метод NodeAdd из TsdContainerNode. Хотя исходники NativeXm могут и отличаться. Пробовал на версии 4.00 (23jul2011)

ЗЫ аналогично и NodeAdd отработал
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 13.01.2015 в 11:32.
Аватар вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Макрос добавление строки, копирование данных с условием MaxxVer Microsoft Office Excel 15 22.08.2017 12:24
добавление(копирование) листа при смене месяца runik Microsoft Office Excel 1 16.01.2014 11:32
XML Mapper, отображение только первого нода KAMIKAZA БД в Delphi 0 13.10.2011 13:28
Копирование и добавление фиксированных столбцов Lock95 Microsoft Office Excel 6 06.05.2011 11:23
сохранения данных в стрингриде после редактирования его (добавление) ansysadmin БД в Delphi 0 23.11.2009 17:37