[jdom]ajout suppression d'éléments dans un fichier jdom
2 réponses
Daniel Moyne
cette question s'adresse plutôt aux connaisseurs et utilisateurs de jdom.
Je charge un fichier xml de manière classique :
sxb = new SAXBuilder();
document = sxb.build(file);
documentRoot = document.getRootElement();
ensuite je vais chercher un élément records contenant plusieurs
enregistrement :
recordsElement = documentRoot.getChild(MARRIAGE_XML_RECORDS);
ensuite je place dans une liste tous les enregistrements contenus dans
l'élément recordsElement
myListOfMarriageElements=recordsElement.getChildren();
Jusque là pas de problème, mais quand je veux supprimer un élément il semble
qu'il suffise de le supprimer de la liste myListOfMarriageElements, par
exemple :
myListOfMarriageElements.remove(à_cet_index);
qui évidemment retire l'élément à_cet_index de la liste
myListOfMarriageElements, mais qui semble-t-il le retire aussi de document
mettant ainsi ma structure jdom à jour (= sans élément à_cet_index) sans
rien à avoir à faire d'autre !
je vérifie cela en imprimant le fichier avant puis après avec cette routine
:
XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat());
sortie.output(document, System.out);
qui travaille bien sur le document lui-même et pas sur la liste qui elle est
pour moi modifiée conformément à mes souhaits ; je n'ai pas à faire par
exemple :
recordsElement.removeContent() ou autre !
idem pour des permutations d'éléments opérés sur la liste.
Je rêve ou quoi !
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Mayeul
Daniel Moyne wrote:
cette question s'adresse plutôt aux connaisseurs et utilisateurs de jdom.
Je charge un fichier xml de manière classique : sxb = new SAXBuilder(); document = sxb.build(file); documentRoot = document.getRootElement(); ensuite je vais chercher un élément records contenant plusieurs enregistrement : recordsElement = documentRoot.getChild(MARRIAGE_XML_RECORDS); ensuite je place dans une liste tous les enregistrements contenus dans l'élément recordsElement myListOfMarriageElements=recordsElement.getChildren();
Jusque là pas de problème, mais quand je veux supprimer un élément il semble qu'il suffise de le supprimer de la liste myListOfMarriageElements, par exemple : myListOfMarriageElements.remove(à_cet_index); qui évidemment retire l'élément à_cet_index de la liste myListOfMarriageElements, mais qui semble-t-il le retire aussi de document mettant ainsi ma structure jdom à jour (= sans élément à_cet_index) sans rien à avoir à faire d'autre !
Ben oui, c'est parce que document contenait cet élément uniquement parce que myListOfMarriageElements le contenait.
Autrement dit, myListOfMarriageElements n'est pas une copie de ce que document contient à cet endroit, *c'est* ce que document contient à cet endroit.
(* Au fait, retirer l'élément à l'index n ne veut pas dire qu'il n'y a plus d'élément à l'index n. Ca veut dire que l'élément d'index n+1 passe à n, n+2 à n+1, etc. Sauf si n est le dernier index de la liste, auquel cas ça revient au même.)
je vérifie cela en imprimant le fichier avant puis après avec cette routine : XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat()); sortie.output(document, System.out);
qui travaille bien sur le document lui-même et pas sur la liste qui elle est pour moi modifiée conformément à mes souhaits ; je n'ai pas à faire par exemple : recordsElement.removeContent() ou autre !
idem pour des permutations d'éléments opérés sur la liste. Je rêve ou quoi !
Je ne vois pas ce que ça a d'étonnant. En Java, les données se passent bien plus souvent par référence que par copie. Il est plutôt normal, et par ailleurs souvent plus pratique, que jdom fonctionne comme cela aussi. D'ailleurs si ce n'était pas le cas, pourquoi recordsElement.removeContent() enlèverait quoi que ce soit du document alors que ce n'est pas sur le document mais sur recordsElement, qu'on travaille ?
-- Mayeul
Daniel Moyne wrote:
cette question s'adresse plutôt aux connaisseurs et utilisateurs de jdom.
Je charge un fichier xml de manière classique :
sxb = new SAXBuilder();
document = sxb.build(file);
documentRoot = document.getRootElement();
ensuite je vais chercher un élément records contenant plusieurs
enregistrement :
recordsElement = documentRoot.getChild(MARRIAGE_XML_RECORDS);
ensuite je place dans une liste tous les enregistrements contenus dans
l'élément recordsElement
myListOfMarriageElements=recordsElement.getChildren();
Jusque là pas de problème, mais quand je veux supprimer un élément il semble
qu'il suffise de le supprimer de la liste myListOfMarriageElements, par
exemple :
myListOfMarriageElements.remove(à_cet_index);
qui évidemment retire l'élément à_cet_index de la liste
myListOfMarriageElements, mais qui semble-t-il le retire aussi de document
mettant ainsi ma structure jdom à jour (= sans élément à_cet_index) sans
rien à avoir à faire d'autre !
Ben oui, c'est parce que document contenait cet élément uniquement parce
que myListOfMarriageElements le contenait.
Autrement dit, myListOfMarriageElements n'est pas une copie de ce que
document contient à cet endroit, *c'est* ce que document contient à cet
endroit.
(* Au fait, retirer l'élément à l'index n ne veut pas dire qu'il n'y a
plus d'élément à l'index n. Ca veut dire que l'élément d'index n+1 passe
à n, n+2 à n+1, etc. Sauf si n est le dernier index de la liste, auquel
cas ça revient au même.)
je vérifie cela en imprimant le fichier avant puis après avec cette routine
:
XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat());
sortie.output(document, System.out);
qui travaille bien sur le document lui-même et pas sur la liste qui elle est
pour moi modifiée conformément à mes souhaits ; je n'ai pas à faire par
exemple :
recordsElement.removeContent() ou autre !
idem pour des permutations d'éléments opérés sur la liste.
Je rêve ou quoi !
Je ne vois pas ce que ça a d'étonnant. En Java, les données se passent
bien plus souvent par référence que par copie. Il est plutôt normal, et
par ailleurs souvent plus pratique, que jdom fonctionne comme cela
aussi. D'ailleurs si ce n'était pas le cas, pourquoi
recordsElement.removeContent() enlèverait quoi que ce soit du document
alors que ce n'est pas sur le document mais sur recordsElement, qu'on
travaille ?
cette question s'adresse plutôt aux connaisseurs et utilisateurs de jdom.
Je charge un fichier xml de manière classique : sxb = new SAXBuilder(); document = sxb.build(file); documentRoot = document.getRootElement(); ensuite je vais chercher un élément records contenant plusieurs enregistrement : recordsElement = documentRoot.getChild(MARRIAGE_XML_RECORDS); ensuite je place dans une liste tous les enregistrements contenus dans l'élément recordsElement myListOfMarriageElements=recordsElement.getChildren();
Jusque là pas de problème, mais quand je veux supprimer un élément il semble qu'il suffise de le supprimer de la liste myListOfMarriageElements, par exemple : myListOfMarriageElements.remove(à_cet_index); qui évidemment retire l'élément à_cet_index de la liste myListOfMarriageElements, mais qui semble-t-il le retire aussi de document mettant ainsi ma structure jdom à jour (= sans élément à_cet_index) sans rien à avoir à faire d'autre !
Ben oui, c'est parce que document contenait cet élément uniquement parce que myListOfMarriageElements le contenait.
Autrement dit, myListOfMarriageElements n'est pas une copie de ce que document contient à cet endroit, *c'est* ce que document contient à cet endroit.
(* Au fait, retirer l'élément à l'index n ne veut pas dire qu'il n'y a plus d'élément à l'index n. Ca veut dire que l'élément d'index n+1 passe à n, n+2 à n+1, etc. Sauf si n est le dernier index de la liste, auquel cas ça revient au même.)
je vérifie cela en imprimant le fichier avant puis après avec cette routine : XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat()); sortie.output(document, System.out);
qui travaille bien sur le document lui-même et pas sur la liste qui elle est pour moi modifiée conformément à mes souhaits ; je n'ai pas à faire par exemple : recordsElement.removeContent() ou autre !
idem pour des permutations d'éléments opérés sur la liste. Je rêve ou quoi !
Je ne vois pas ce que ça a d'étonnant. En Java, les données se passent bien plus souvent par référence que par copie. Il est plutôt normal, et par ailleurs souvent plus pratique, que jdom fonctionne comme cela aussi. D'ailleurs si ce n'était pas le cas, pourquoi recordsElement.removeContent() enlèverait quoi que ce soit du document alors que ce n'est pas sur le document mais sur recordsElement, qu'on travaille ?
-- Mayeul
Daniel Moyne
Mayeul wrote:
Daniel Moyne wrote:
cette question s'adresse plutôt aux connaisseurs et utilisateurs de jdom.
Je charge un fichier xml de manière classique : sxb = new SAXBuilder(); document = sxb.build(file); documentRoot = document.getRootElement(); ensuite je vais chercher un élément records contenant plusieurs enregistrement : recordsElement = documentRoot.getChild(MARRIAGE_XML_RECORDS); ensuite je place dans une liste tous les enregistrements contenus dans l'élément recordsElement myListOfMarriageElements=recordsElement.getChildren();
Jusque là pas de problème, mais quand je veux supprimer un élément il semble qu'il suffise de le supprimer de la liste myListOfMarriageElements, par exemple : myListOfMarriageElements.remove(à_cet_index); qui évidemment retire l'élément à_cet_index de la liste myListOfMarriageElements, mais qui semble-t-il le retire aussi de document mettant ainsi ma structure jdom à jour (= sans élément à_cet_index) sans rien à avoir à faire d'autre !
Ben oui, c'est parce que document contenait cet élément uniquement parce que myListOfMarriageElements le contenait.
Autrement dit, myListOfMarriageElements n'est pas une copie de ce que document contient à cet endroit, *c'est* ce que document contient à cet endroit.
(* Au fait, retirer l'élément à l'index n ne veut pas dire qu'il n'y a plus d'élément à l'index n. Ca veut dire que l'élément d'index n+1 passe à n, n+2 à n+1, etc. Sauf si n est le dernier index de la liste, auquel cas ça revient au même.)
je vérifie cela en imprimant le fichier avant puis après avec cette routine : XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat()); sortie.output(document, System.out);
qui travaille bien sur le document lui-même et pas sur la liste qui elle est pour moi modifiée conformément à mes souhaits ; je n'ai pas à faire par exemple : recordsElement.removeContent() ou autre !
idem pour des permutations d'éléments opérés sur la liste. Je rêve ou quoi !
Je ne vois pas ce que ça a d'étonnant. En Java, les données se passent bien plus souvent par référence que par copie. Il est plutôt normal, et par ailleurs souvent plus pratique, que jdom fonctionne comme cela aussi. D'ailleurs si ce n'était pas le cas, pourquoi recordsElement.removeContent() enlèverait quoi que ce soit du document alors que ce n'est pas sur le document mais sur recordsElement, qu'on travaille ?
Si mon étonnement est que quand on fait : myListOfMarriageElements=recordsElement.getChildren(); on crée une liste à partir de document, mais ensuite pourquoi est-ce qu'un bricolage sur la liste aurait un impact sur document comme si le père des éléments de la liste myListOfMarriageElements qui lui fait partie de document était à l'écoute des modifications opérées sur ses enfants dans une liste fabriquée à l'occasion.
Mais ta remarque sur recordsElement.removeContent(...) est pertinente ; si on lui enlève un de ses enfants on l'enlève aussi à document !
D'un autre côté l'exemple suivant : listeBidon = new ArrayList<Integer>(); listeBidon.add(0); listeBidon.add(1); listeBidon.add(2); listeBidon.add(3); listeBidon.add(4); List<Integer>listeBidon2 = new ArrayList<Integer>(); listeBidon2=listeBidon.subList(2,3); listeBidon2.remove(0); System.out.println("listeBidon :" + listeBidon); System.out.println("listeBidon2 :" + listeBidon2); est sans appel puisque retirer un élément ici "2" de la subliste listeBidon2 le retire de la liste principale !
J'ai peut-être eu un coup de chaud !
Amicalement
Mayeul wrote:
Daniel Moyne wrote:
cette question s'adresse plutôt aux connaisseurs et utilisateurs de jdom.
Je charge un fichier xml de manière classique :
sxb = new SAXBuilder();
document = sxb.build(file);
documentRoot = document.getRootElement();
ensuite je vais chercher un élément records contenant plusieurs
enregistrement :
recordsElement = documentRoot.getChild(MARRIAGE_XML_RECORDS);
ensuite je place dans une liste tous les enregistrements contenus dans
l'élément recordsElement
myListOfMarriageElements=recordsElement.getChildren();
Jusque là pas de problème, mais quand je veux supprimer un élément il
semble qu'il suffise de le supprimer de la liste
myListOfMarriageElements, par exemple :
myListOfMarriageElements.remove(à_cet_index);
qui évidemment retire l'élément à_cet_index de la liste
myListOfMarriageElements, mais qui semble-t-il le retire aussi de
document mettant ainsi ma structure jdom à jour (= sans élément
à_cet_index) sans rien à avoir à faire d'autre !
Ben oui, c'est parce que document contenait cet élément uniquement parce
que myListOfMarriageElements le contenait.
Autrement dit, myListOfMarriageElements n'est pas une copie de ce que
document contient à cet endroit, *c'est* ce que document contient à cet
endroit.
(* Au fait, retirer l'élément à l'index n ne veut pas dire qu'il n'y a
plus d'élément à l'index n. Ca veut dire que l'élément d'index n+1 passe
à n, n+2 à n+1, etc. Sauf si n est le dernier index de la liste, auquel
cas ça revient au même.)
je vérifie cela en imprimant le fichier avant puis après avec cette
routine
:
XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat());
sortie.output(document, System.out);
qui travaille bien sur le document lui-même et pas sur la liste qui elle
est pour moi modifiée conformément à mes souhaits ; je n'ai pas à faire
par exemple :
recordsElement.removeContent() ou autre !
idem pour des permutations d'éléments opérés sur la liste.
Je rêve ou quoi !
Je ne vois pas ce que ça a d'étonnant. En Java, les données se passent
bien plus souvent par référence que par copie. Il est plutôt normal, et
par ailleurs souvent plus pratique, que jdom fonctionne comme cela
aussi. D'ailleurs si ce n'était pas le cas, pourquoi
recordsElement.removeContent() enlèverait quoi que ce soit du document
alors que ce n'est pas sur le document mais sur recordsElement, qu'on
travaille ?
Si mon étonnement est que quand on fait :
myListOfMarriageElements=recordsElement.getChildren();
on crée une liste à partir de document, mais ensuite pourquoi est-ce qu'un
bricolage sur la liste aurait un impact sur document comme si le père des
éléments de la liste myListOfMarriageElements qui lui fait partie de
document était à l'écoute des modifications opérées sur ses enfants dans
une liste fabriquée à l'occasion.
Mais ta remarque sur recordsElement.removeContent(...) est pertinente ; si
on lui enlève un de ses enfants on l'enlève aussi à document !
D'un autre côté l'exemple suivant :
listeBidon = new ArrayList<Integer>();
listeBidon.add(0);
listeBidon.add(1);
listeBidon.add(2);
listeBidon.add(3);
listeBidon.add(4);
List<Integer>listeBidon2 = new ArrayList<Integer>();
listeBidon2=listeBidon.subList(2,3);
listeBidon2.remove(0);
System.out.println("listeBidon :" + listeBidon);
System.out.println("listeBidon2 :" + listeBidon2);
est sans appel puisque retirer un élément ici "2" de la subliste listeBidon2
le retire de la liste principale !
cette question s'adresse plutôt aux connaisseurs et utilisateurs de jdom.
Je charge un fichier xml de manière classique : sxb = new SAXBuilder(); document = sxb.build(file); documentRoot = document.getRootElement(); ensuite je vais chercher un élément records contenant plusieurs enregistrement : recordsElement = documentRoot.getChild(MARRIAGE_XML_RECORDS); ensuite je place dans une liste tous les enregistrements contenus dans l'élément recordsElement myListOfMarriageElements=recordsElement.getChildren();
Jusque là pas de problème, mais quand je veux supprimer un élément il semble qu'il suffise de le supprimer de la liste myListOfMarriageElements, par exemple : myListOfMarriageElements.remove(à_cet_index); qui évidemment retire l'élément à_cet_index de la liste myListOfMarriageElements, mais qui semble-t-il le retire aussi de document mettant ainsi ma structure jdom à jour (= sans élément à_cet_index) sans rien à avoir à faire d'autre !
Ben oui, c'est parce que document contenait cet élément uniquement parce que myListOfMarriageElements le contenait.
Autrement dit, myListOfMarriageElements n'est pas une copie de ce que document contient à cet endroit, *c'est* ce que document contient à cet endroit.
(* Au fait, retirer l'élément à l'index n ne veut pas dire qu'il n'y a plus d'élément à l'index n. Ca veut dire que l'élément d'index n+1 passe à n, n+2 à n+1, etc. Sauf si n est le dernier index de la liste, auquel cas ça revient au même.)
je vérifie cela en imprimant le fichier avant puis après avec cette routine : XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat()); sortie.output(document, System.out);
qui travaille bien sur le document lui-même et pas sur la liste qui elle est pour moi modifiée conformément à mes souhaits ; je n'ai pas à faire par exemple : recordsElement.removeContent() ou autre !
idem pour des permutations d'éléments opérés sur la liste. Je rêve ou quoi !
Je ne vois pas ce que ça a d'étonnant. En Java, les données se passent bien plus souvent par référence que par copie. Il est plutôt normal, et par ailleurs souvent plus pratique, que jdom fonctionne comme cela aussi. D'ailleurs si ce n'était pas le cas, pourquoi recordsElement.removeContent() enlèverait quoi que ce soit du document alors que ce n'est pas sur le document mais sur recordsElement, qu'on travaille ?
Si mon étonnement est que quand on fait : myListOfMarriageElements=recordsElement.getChildren(); on crée une liste à partir de document, mais ensuite pourquoi est-ce qu'un bricolage sur la liste aurait un impact sur document comme si le père des éléments de la liste myListOfMarriageElements qui lui fait partie de document était à l'écoute des modifications opérées sur ses enfants dans une liste fabriquée à l'occasion.
Mais ta remarque sur recordsElement.removeContent(...) est pertinente ; si on lui enlève un de ses enfants on l'enlève aussi à document !
D'un autre côté l'exemple suivant : listeBidon = new ArrayList<Integer>(); listeBidon.add(0); listeBidon.add(1); listeBidon.add(2); listeBidon.add(3); listeBidon.add(4); List<Integer>listeBidon2 = new ArrayList<Integer>(); listeBidon2=listeBidon.subList(2,3); listeBidon2.remove(0); System.out.println("listeBidon :" + listeBidon); System.out.println("listeBidon2 :" + listeBidon2); est sans appel puisque retirer un élément ici "2" de la subliste listeBidon2 le retire de la liste principale !