J'ai un nœud de document DOM. Comment puis-je supprimer tous ses nœuds d'enfant? Par exemple: devient: p> Je veux supprimer tous les nœuds enfants de employé code>. p> p>
6 Réponses :
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.
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 () code>
ne peut pas être utilisé avec la boucle de Foreach de Java car nœud # getChildNodes () code> retourne un
NODELIST code>
qui ne met pas en œuvre le java.lang.itéable code>
interface.
@DANGETZ: C'est vrai. J'ai fait cette erreur moi-même. La réponse de KOP fonctionne, cependant.
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); } } }
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
public static void removeAllChildren(Node node) { for (Node child; (child = node.getFirstChild()) != null; node.removeChild(child)); }
Nul besoin de supprimer les nœuds d'enfants des nœuds d'enfants
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).
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()); }
Il suffit d'utiliser: comme document: p>
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);
Employee
Un code> et
Deux code> 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 code> et
deux code> 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!