Nie do końca wiem, ale jeżeli masz warunek
itemelement.attribute("name")==nazwa
To w przypadku dwóch elementów o dwóch różnych nazwach (name=Testname, name=Testname2), skasuje tylko jeden element (poza tym, czym jest konkretnie zmienna "nazwa" w tym kodzie?)
Poza tym... nie wiem też czy ta cała pętla nie ma sensu w sytuacji, gdy usuwasz elementy z listy, która się kurczy,przy jednocześnym inkrementowaniem licznika i.
Nie znam biblioteki qt, ale tego typu pętla (gdzie inkrementujesz licznik za każdym razem jak kasujesz element) w typowym kontenerze std-owskim nie miała by absolutnie żadnego sensu.
Edit:
https://stackoverflow.com/questions/21721208/qdom-remove-nodes
Tutaj z tego co widzę człowiek chciał dokładnie zrobić to samo
Wyobraź sobie sytuację. Masz kontener z czterema elementami
{El1, El2, El3, El4}
W
lista[0] = El1,
lista[1] = El2,
lista[2] = El3,
lista[3] = El4
Rozpoczynasz pętle, i = 0; i < lista.count() czyli 4; ++i
Usuwasz lista[0] (El1)
Lista wygląda teraz tak:
{El2, El3, El4}
Ale El2 to już nie jest lista[1], tylko lista[0], bo skasowałeś jeden element,
lista[0] = El2,
lista[1] = El3,
lista[2] = El4
I teraz licznik i zwiększasz o 1. Po skasowaniu elementu i przesunięciu elementów o jeden po prawej stronie od elementu skasowanego
I próbujesz skasować lista[1]. Chciałeś skasować kolejny element - El2, a nie El3, skasowałeś El3. Przeskoczyłeś o dwie pozycje.
Według mnie rozwiązanie mogłoby wygladać mniej więcej tak (zakładając, że te warunki które podaleś faktycznie takie mają być):
int i = 0;
while (i < lista.count()) {
itemnode=lista.at(i);
itemelement=itemnode.firstChildElement("Baza")
if(!itemelement.isNull()&&itemelement.attribute("name")==nazwa)
{
itemnode.removeChild(itemelement);
} else {
++i;
}
}
Kiedy kasujesz element - kasujesz element i nic z i nie robisz, bo prawa strona kontenera przejdzie w lewą strone
Kiedy nie kasujesz - przeskakujesz z licznikiem o jedną pozycje do przodu.