Удаляя дочерний элемент из элемента, вы удаляете его из дочерних узлов, что означает, что следующий дочерний элемент теперь находится в индексе дочернего элемента, который вы удалили.Но ваш цикл продолжается с индексом next , пропуская этого потомка.Например: предположим, у вас есть:
0: Child A
1: Child B
2: Child C
3: Child D
Для i == 0
, допустим, вы не удаляете Child A. Ваш цикл добавляет один к i
и вы продолжаете с i == 1
.Вы делаете удаления ребенка B. Теперь у вас есть:
0: Child A
1: Child C
2: Child D
.. но ваш цикл добавляет один к i
и теперь i == 2
, и следующий ребенок, на которого вы смотрите, это ChildD. Вы никогда не смотрели на Дитя С.
Обычные решения:
Цикл назад, поэтому индекс уменьшается, и поэтому это не имеет значенияудаляете ли вы ребенка по указанному индексу;или
Сделайте снимок списка дочерних узлов перед изменением элемента, чтобы при удалении дочернего элемента из элемента он не удалялся изваш снимок
Переход назад довольно прост:
for (int i = updatedNode.getChildNodes().getLength() - 1; i >= 0; i--)
Примечание: я бы, вероятно, также позвонил getChildNodes
просто один раз и повторно использовать полученный NodeList
объект:
NodeList children = updatedNode.getChildNodes();
for (int i = children.getLength() - 1; i >= 0; i--)
// ...and use `children`, not `updatedNode.getChildNodes()`, in the loop body...
}