Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > удалить ChildNode


Автор: golfV 19.12.2009, 01:35
Доброго времени суток!

есть такая проблемка. Надо удалить ChildNode делаю таким способом
Код

for i:=0 to XMLDoc.DocumentElement.ChildNodes.Count -1 do
       begin
 XMLCri.DocumentElement.ChildNodes.Delete('MP');

 XMLCri.SaveToFile('c:\crit.xml');
 end;

он удаляет все ChildNode <MP> а вопрос состоит в том что как удалить ChildNode  name которого начанается на 11 Выгладит он вот так
Код

<MP type="T" name=" 11.0.1">
<MP type="T" name=" 11.0.2">
 
подскажите если кто знает?
Зарание большое спасибо!!!

Автор: Dom 19.12.2009, 02:57
Как вариант - вести перебор всех узлов МР и проверять значение атрибута name.

При этом если проверка и удаление будет выполнятся в цикле то лучше делать так
Код

for i := XMLDoc.DocumentElement.ChildNodes.Count -1 downto 0 do

Автор: golfV 19.12.2009, 17:00
попробую так сделать, а вот такой вопрос как проверить что name  начинается на 11, потому что писать каждый номер будет очень неудобно так как их очень много.

Автор: Keeper89 19.12.2009, 17:07
Код

StrToInt(Copy(name, 2, 2)) = 11

P.S. С индексами надо смотреть, непонятно где там есть пробелы.

Автор: Dom 19.12.2009, 18:09
Или через 
Код

Pos('11', Trim(name_str)) = 0

Автор: golfV 20.12.2009, 15:26
а можно немного подробнее как воспользоваться методом Pos или StrToInt?  пробую пробую что то неполучается, проходит без ошибок но ничего неудаляет.

Автор: Dom 20.12.2009, 16:44
Выложи код цикла в котором идет проверка и удаление

Автор: golfV 20.12.2009, 17:08
Код

for i:=0 to XMLDoc.DocumentElement.ChildNodes.Count -1 do
       begin
Name:= XMLCri.ChildNodes[0].ChildNodes[i].Attributes['name'];
if Pos('11', Name) <> 0 then
      XMLCri.DocumentElement.ChildNodes.Delete(i);
end;
XMLCri.SaveToFile('C:\crit.xml');

вот так делаю, он удаляет но только не все, первый раз запустиш удалит один нод с именем на 11, второй раз запустиш удалит еще один, почему так происходит непонимаю

Автор: Dom 20.12.2009, 17:33
А ничего что в объявлении цикла используется XMLDoc, а при проверке и удалении XMLCri? Это не разные вещи?
И пользуйся пошаговой отладкой F8, F7, смотри какие значения принимают твои переменные и сразу будет понятно что не так. Возможно что XMLDoc.DocumentElement.ChildNodes.Count равен нулю.

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

Автор: golfV 20.12.2009, 17:35
XMLDoc и XMLCri там одинаковое количество нодов, поэтому это некак неможет влиять

Автор: Dom 20.12.2009, 17:51
Используется проход по одному документу, чтобы проверить и удалить что-то в другом. После удаления узла счетчик Count уменьшается на единицу например, и смещаются индексы всех остальных узлов.
Пройди пошагово этот цикл и посмотри как он перебирает узлы, какие и в какой последовательности и чему равна переменная Name на каждом шаге.
Вообще странно что AV не выскакивает.

Или вот еще возможная причина - если перед 11 есть пробел, то результат будет уже не 0. В пошаговом режиме посмотри какие значения возвращает эта функция.

Автор: golfV 21.12.2009, 14:02
Все заработало. Dom, сделал проверку  циклом как ты посоветовал
Код

for i := XMLDoc.DocumentElement.ChildNodes.Count -1 downto 0 do


сразу заработало! Большое спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)