XMLDocument.removechild чяднт?

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

Ответить
nds
незнакомец
Сообщения: 2
Зарегистрирован: 17.09.2013 19:09:09

XMLDocument.removechild чяднт?

Сообщение 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"
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Используешь цикл for для итерации по TDOMNodeList с модификацией документа.
GetElementsByTagName возвращает список, отражающий текущее состояние документа, а цикл for вычисляет кол-во итераций один раз в начале, поэтому по мере удаления узлов происходит выход за пределы списка. Не говоря о том, что на каждой итерации список перестраивается с повторным поиском всех элементов по имени...
nds
незнакомец
Сообщения: 2
Зарегистрирован: 17.09.2013 19:09:09

Сообщение nds »

Sergei I. Gorelkin писал(а):Не говоря о том, что на каждой итерации список перестраивается с повторным поиском всех элементов по имени...

чудны извращения мысли программистов lcl
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

Извращения-то тут откуда? Такое поведение определено в стандартах DOM.
Аватара пользователя
vada
энтузиаст
Сообщения: 689
Зарегистрирован: 14.02.2006 12:43:17

Сообщение vada »

Код: Выделить всё

for i:=1 to il.Count do
il.Item[i].ParentNode.RemoveChild(il.Item[i]);

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