Страница 1 из 1

XMLDocument.removechild чяднт?

СообщениеДобавлено: 17.09.2013 19:17:16
nds
Код: Выделить всё
var
fb2: TXMLDocument;
   il:TDOMNodeList;
////вырезан кусок не имеющий отношения к проблеме//////     
il:=fb2.GetElementsByTagName('binary');
for i:=1 to il.Count do
il.Item[i].ParentNode.RemoveChild(il.Item[i]);

вылетает на последней строчке с ошибкой "External:SIGSEGV"

Re: XMLDocument.removechild чяднт?

СообщениеДобавлено: 17.09.2013 20:15:45
Sergei I. Gorelkin
Используешь цикл for для итерации по TDOMNodeList с модификацией документа.
GetElementsByTagName возвращает список, отражающий текущее состояние документа, а цикл for вычисляет кол-во итераций один раз в начале, поэтому по мере удаления узлов происходит выход за пределы списка. Не говоря о том, что на каждой итерации список перестраивается с повторным поиском всех элементов по имени...

Re: XMLDocument.removechild чяднт?

СообщениеДобавлено: 17.09.2013 21:50:09
nds
Sergei I. Gorelkin писал(а):Не говоря о том, что на каждой итерации список перестраивается с повторным поиском всех элементов по имени...

чудны извращения мысли программистов lcl

Re: XMLDocument.removechild чяднт?

СообщениеДобавлено: 11.10.2013 05:04:31
Иван Шихалев
Извращения-то тут откуда? Такое поведение определено в стандартах DOM.

Re: XMLDocument.removechild чяднт?

СообщениеДобавлено: 11.10.2013 13:36:30
vada
Код: Выделить всё
for i:=1 to il.Count do
il.Item[i].ParentNode.RemoveChild(il.Item[i]);

Нууу... Так нельзя. Полюбасу грабли будут. Если есть желание в цикле элементы поудалять, так надо цикл в обратную сторону запускать downto, типа.