2014-02-06 8 views
2

Я использую следующий код для удаления нескольких элементов из файла XMl.removeChild() метод break for loop

NodeList removeNodeList = doc.getElementsByTagName("server1"); 
Element rootElement = doc.getDocumentElement(); 

for (int i = 0; i < removeNodeList.getLength(); i++) { 
    rootElement.removeChild(removeNodeList.item(i)); 
} 

Но после удаления одного элемента он выходит из цикла. В чем проблема.

Ниже приведено содержимое моего XML-файла.

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<start> 

    <category name="server1"/> 
    <category name="server2"/> 

    <server1 name="serverName1" value="serverValue"/> 
    <server1 name="serverName1" value="serverValue"/> 

    <server2 name="serverName2" value="serverValue"/> 

</start> 
+1

Я бы предположил, что 'NodeList' является динамическим и удаляет элемент, обновляющий (уменьшает) длину, в результате чего ваше условие цикла проверяется только на true в первый раз. Это в первую очередь основано на том, как они работают в JavaScript, хотя у меня нет опыта работы с XML-документами на Java. –

+1

Вы проверили несколько вещей вроде - length of removeNodeList. И каково содержимое xml после выполнения цикла for, удаляется ли только один элемент? – csn

+0

@csn Спасибо за ответ, я проверил размер 'NodeList', его 2 до этого он уменьшил до 1. – Vishrant

ответ

1

Я нашел решение:

Позвольте мне объяснить, в чем была проблема в деталях.

NodeList removeNodeList = doc.getElementsByTagName("server1"); removeNodeList.getLength() вернет 2, поскольку есть 2 узлов с NodeName затем после выполнения rootElement.removeChild(removeNodeList.item(i)); и затем проверки for loop условия i.e. значение i является 1 и removeNodeList.getLength() возвращается 1, как теперь только один узел с NodeName пребывают в DOM document и это условие было неудача в 1 < 1 is false

так я последовал следующий подход:

Удалите все элементы после того, как NodeList больше не используется.

NodeList nodes = doc.getElementsByTagName(elementName); 
Set<Element> targetElements = new HashSet<Element>(); 

for (int i = 0; i < nodes.getLength(); i++) { 
    Element e = (Element)nodes.item(i); 
    targetElements.add(e); 
} 
for (Element e: targetElements) { 
    e.getParentNode().removeChild(e); 
} 
+0

лучший ответ когда-либо !!! – aspiringqa

0

Удаление элемента из списка уменьшает его размер на 1, что прерывает итерацию. Вы должны просматривать список в обратном направлении (от последнего до первого узла), как описано в этом вопросе:

Removing DOM nodes when traversing a NodeList