2012-05-05 4 views
0

Я пытаюсь удалить узел из XML-файла, обработанного DOM в Java.Удаление узла в структуре XML Java DOM

private Node deleteChildNode (Node node, String nodeName) 
{ 
    Node tempNode = null; 
    NodeList nl = node.getChildNodes(); 
    for (int i = 0; i < nl.getLength(); i++) 
    { 
     tempNode = nl.item(i); 
     if (tempNode.getNodeName().equals(nodeName)) 
     {     
      tempNode= node.removeChild(tempNode);     
     }   
    } 
    return node; 
} 

Вызов с:

nodeClone = deleteChildNode(nodeClone, "L123"); 

Но узел не был удален.

NodeList nl = nodeClone.getChildNodes(); 
     for (int i = 0; i < nl.getLength(); i++) 
      System.out.println(nl.item(i).getNodeName()); 

Показывает узел «L123».

Заранее благодарен!

+0

Почему бы эта помощь? Узел и имя. Узел можно найти и сохранить в «tempNode» после «node.removeChild». Но его не удаляли в «узле». Это не может зависеть от XML-файла (поскольку узел был найден). И вокруг него не должно быть никакого кода. Просто поиск узла для удаления. – Skolleus

+0

Я просто не могу дать вам больше кода. В пятницу я не проверил намного больше от VersionControlSystem, и он будет работать с каждым xml. – Skolleus

ответ

5

Если у вас есть несколько узлов с именем узла под данным узлом, то ваш код не будет работать, потому что вы пропустите узлы. использование NodeList при удалении узлов немного сложно. в основном, когда вы удаляете дочерний узел, если модифицируете NodeList, чтобы все последующие узлы были сдвинуты назад на один индекс. (аналогично удалению элементов из списка при итерации по списку с использованием индексов). простым решением было бы добавить «-i;» после удаления дочернего узла.

+0

Большое спасибо. Вот и все. И это простое исправление отлично работает: D Я бы хотел «проголосовать», но моя репутация <15. – Skolleus

+0

@Skolleus - так как вы задали вопрос, вы не проголосуете, вы «принимаете» ответ. – jtahlborn

+0

@Skolleus - также в будущем ваш вопрос, скорее всего, был бы дан ответ раньше, если бы вы поняли, что есть _multiple_ соответствующие узлы, а некоторые из них удаляются, но не другие. – jtahlborn

1

Я использую этот небольшой удобный метод, чтобы очистить ребенок пройденного узла:

public static void clearChildNodes(Node node){ 
    while(node.hasChildNodes()){ 
     NodeList nList = node.getChildNodes(); 
     int index = node.getChildNodes().getLength() - 1; 

     Node n = nList.item(index); 
     clearChildNodes(n); 
     node.removeChild(n); 
    } 

} 
Смежные вопросы