Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[jdom]ajout suppression d'éléments dans un fichier jdom

2 réponses
Avatar
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 !

Amicalement.

2 réponses

Avatar
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
Avatar
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