11
votes

Supprimer tous les nœuds d'enfants d'un nœud

J'ai un nœud de document DOM. Comment puis-je supprimer tous ses nœuds d'enfant? Par exemple: xxx

devient: xxx

Je veux supprimer tous les nœuds enfants de employé .


4 commentaires

Employee Un et Deux ne possède aucun enfant. Avez-vous essayé de lire dans un DOM, de le changer et d'écrire le résultat?


Je veux enlever un, deux elle-même comme ils sont un enfant d'employé


@Peter, je pense qu'il voulait dire supprimer tous les nœuds enfants si l'employé avec un et deux est deux instances. @akshay, veuillez poster le code qui effectue (ou tente de) cette activité. Je n'ai tout simplement pas le temps de conjurer un exemple respecté qui effectue ce dont vous avez besoin.


Demanda déjà plusieurs fois sur Stackoverflow. Cela pourrait aider: Stackoverflow.com/questions/321860/... . Bonne chance!


6 Réponses :


-1
votes
    public static void removeAll(Node node) 
    {
        for(Node n : node.getChildNodes())
        {
            if(n.hasChildNodes()) //edit to remove children of children
            {
              removeAll(n);
              node.removeChild(n);
            }
            else
              node.removeChild(n);
        }
    }
}
This will remove all the child elements of a Node by passing the employee node in.

8 commentaires

Je pense qu'il préférerait si vous envoyez le nœud "Employee" et que vous venez de supprimer tous les enfants, dans ce cas si vous le faites, vous supprimerez tous les nœuds des employés.


J'ai réalisé mon erreur après avoir relu son poteau, merci de l'avoir dirigé vers la RMT


BTW, doit-il être récursif? Comment ce code fonctionnera sur


Je n'avais pas envisagé cela, mais ce serait une solution vraiment facile. Je modifie la solution ci-dessus.


Pourquoi passer la peine d'éliminer les autres enfants récursives? Je ne vois rien dans la question qui suggérerait une raison de le faire.


En outre, cela ne compile pas. Il faut faire très attention à la modifier pour compiler, de ne pas faire la même erreur que dans la réponse de Leoimyname.


nœud #getchildnodes () ne peut pas être utilisé avec la boucle de Foreach de Java car nœud # getChildNodes () retourne un NODELIST qui ne met pas en œuvre le java.lang.itéable interface.


@DANGETZ: C'est vrai. J'ai fait cette erreur moi-même. La réponse de KOP fonctionne, cependant.



-1
votes
private static void removeAllChildNodes(Node node) {
    NodeList childNodes = node.getChildNodes();
    int length = childNodes.getLength();
    for (int i = 0; i < length; i++) {
        Node childNode = childNodes.item(i);
        if(childNode instanceof Element) {
            if(childNode.hasChildNodes()) {
                removeAllChildNodes(childNode);                
            }        
            node.removeChild(childNode);  
        }
    }
}

2 commentaires

Pourquoi passer la peine d'éliminer les enfants des nœuds des enfants? Ne voudrais pas que les enfants suffisent?


De plus, cela ne peut pas fonctionner correctement, car vous enlevez en accédant par index et en passant de petits à grands. Donc, dans l'exemple ci-dessus, vous supprimez d'abord l'index 0, qui est . Ensuite, vous supprimez l'index 1. Toutefois, car a été supprimé, est à l'index 0 et < / code> est à l'index 1. Vous supprimez donc , laissant à index 0. Enfin, vous essayez de supprimer l'index 2, mais il y a Un seul nœud est parti dans la liste, vous obtenez donc une exception.



1
votes
public static void removeAllChildren(Node node)
{
  for (Node child; (child = node.getFirstChild()) != null; node.removeChild(child));
}

0 commentaires

51
votes

Nul besoin de supprimer les nœuds d'enfants des nœuds d'enfants xxx


1 commentaires

Si la liste des nœuds est mise en œuvre avec un tableau, il peut être plus efficace de supprimer le dernier enfant que le premier enfant (qui nécessite de transférer les enfants restants dans le tableau).



0
votes
public static void removeAllChildren(Node node) {
    NodeList nodeList = node.getChildNodes();
    int i = 0;
    do {
        Node item = nodeList.item(i);
        if (item.hasChildNodes()) {
            removeAllChildren(item);
            i--;
        }
        node.removeChild(item);
        i++;
    } while (i < nodeList.getLength());
}

0 commentaires

1
votes

Il suffit d'utiliser: xxx

comme document: xxx


1 commentaires

Bonne idée, mais je pense vraiment que vous devriez écrire qu'il crée une copie du nœud et que pour remplacer le nœud réel dans le fichier, il faut également ajouter Node.getparentNode (). Rassemblé (résultat, noeud);