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

[JDOM]modifications non sauvées dans fichier

9 réponses
Avatar
Daniel Moyne
Qui connaît bien JDOM ? ; je lis un fichier XML (file) sans problème avec :
/* création instance de SAXBuilder */
sxb = new SAXBuilder();
document = sxb.build(file);
documentRoot = (new SAXBuilder()).build(file).getRootElement();

Puis je map les élements qui m'intéressent :
Map<Integer, Element> my_rawMap = new HashMap<Integer, Element>();
records = documentRoot.getChild(MARRIAGE_XML_RECORDS);
List myrecords = records.getChildren();
Iterator iterator = myrecords.iterator();
while (iterator.hasNext()) {
Object next = iterator.next();
Element element = (Element) next;
my_rawMap.put(Integer.parseInt(element.getAttributeValue(JDOM.MARRIAGE_XML_RECORD_INDEX)), element);
}
marriageRecordElementOrderedMap = new TreeMap(my_rawMap);

Jusque-là aucun problème.

Ensuite je fais des mises à jour sur les éléments de map là encore sans problème.

Quand je sauve mon fichier avec :
try {
/* définition affichage classique avec getPrettyFormat() */
XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat());
/* enregistrement dans fichier */
sortie.output(document, new FileOutputStream(newFile));
} catch (IOException ee) {
throw new RuntimeException(ee.getMessage());
}

En fait je sauve ce que j'ai chargé sans plus aucunes des modifications n'apparaît dans le fichier output ; jusqu'à maintenant l'essentiel des modififations sont du type :
element_du_map.setAttribute("Attribut", "valeur_attribut");

mais il y en aura d'autres.

L'erreur est où quand je travaille sur les élements est-ce que je travaille sur bien sur "document" ou alors sur quoi ?

Amicalement.

9 réponses

Avatar
Yliur
Daniel Moyne a écrit :
Qui connaît bien JDOM ? ; je lis un fichier XML (file) sans problème avec :
/* création instance de SAXBuilder */
sxb = new SAXBuilder();
document = sxb.build(file);
documentRoot = (new SAXBuilder()).build(file).getRootElement();

Puis je map les élements qui m'intéressent :
Map<Integer, Element> my_rawMap = new HashMap<Integer, Element>();
records = documentRoot.getChild(MARRIAGE_XML_RECORDS);
List myrecords = records.getChildren();
Iterator iterator = myrecords.iterator();
while (iterator.hasNext()) {
Object next = iterator.next();
Element element = (Element) next;
my_rawMap.put(Integer.parseInt(element.getAttributeValue(JDOM.MARRIAGE_XML_RECORD_INDEX)), element);
}
marriageRecordElementOrderedMap = new TreeMap(my_rawMap);

Jusque-là aucun problème.

Ensuite je fais des mises à jour sur les éléments de map là encore sans problème.

Quand je sauve mon fichier avec :
try {
/* définition affichage classique avec getPrettyFormat() */
XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat());
/* enregistrement dans fichier */
sortie.output(document, new FileOutputStream(newFile));
} catch (IOException ee) {
throw new RuntimeException(ee.getMessage());
}

En fait je sauve ce que j'ai chargé sans plus aucunes des modifications n'apparaît dans le fichier output ; jusqu'à maintenant l'essentiel des modififations sont du type :
element_du_map.setAttribute("Attribut", "valeur_attribut");

mais il y en aura d'autres.

L'erreur est où quand je travaille sur les élements est-ce que je travaille sur bien sur "document" ou alors sur quoi ?

Amicalement.




Peut-être fermer le flux d'écriture ?

OutputStream ecr = new FileOutputStream (newFile) ; // Avec un petit tempon c'est mieux (-> BufferedOutputStream)
sortie.output (document, ecr) ;
ecr.close() ;

Et pester contre developpez.com si c'est là que vous avez pioché votre exemple ;) .
Ou plus simplement leur signaler le problème pour les prochains...
Avatar
Christian Laborde
Est-ce que l'objet enregistré est bien l'objet modifié ?

Quel est le lien entre l'objet document et l'objet
documentRoot ?

Salut

Yliur a écrit :
Daniel Moyne a écrit :
Qui connaît bien JDOM ? ; je lis un fichier XML (file) sans problème
avec :
/* création instance de SAXBuilder */
sxb = new SAXBuilder();
document = sxb.build(file);
documentRoot = (new SAXBuilder()).build(file).getRootElement();

Puis je map les élements qui m'intéressent :
Map<Integer, Element> my_rawMap = new HashMap<Integer, Element>();
records = documentRoot.getChild(MARRIAGE_XML_RECORDS);
List myrecords = records.getChildren();
Iterator iterator = myrecords.iterator();
while (iterator.hasNext()) {
Object next = iterator.next();
Element element = (Element) next;
my_rawMap.put(Integer.parseInt(element.getAttributeValue(JDOM.MARRIAGE_XML_RECORD_INDEX)),
element);
}
marriageRecordElementOrderedMap = new TreeMap(my_rawMap);

Jusque-là aucun problème.

Ensuite je fais des mises à jour sur les éléments de map là encore
sans problème.

Quand je sauve mon fichier avec :
try {
/* définition affichage classique avec getPrettyFormat() */
XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat());
/* enregistrement dans fichier */
sortie.output(document, new FileOutputStream(newFile));
} catch (IOException ee) {
throw new RuntimeException(ee.getMessage());
}

En fait je sauve ce que j'ai chargé sans plus aucunes des
modifications n'apparaît dans le fichier output ; jusqu'à maintenant
l'essentiel des modififations sont du type :
element_du_map.setAttribute("Attribut", "valeur_attribut");

mais il y en aura d'autres.

L'erreur est où quand je travaille sur les élements est-ce que je
travaille sur bien sur "document" ou alors sur quoi ?

Amicalement.




Peut-être fermer le flux d'écriture ?

OutputStream ecr = new FileOutputStream (newFile) ; // Avec un
petit tempon c'est mieux (-> BufferedOutputStream)
sortie.output (document, ecr) ;
ecr.close() ;

Et pester contre developpez.com si c'est là que vous avez pioché votre
exemple ;) .
Ou plus simplement leur signaler le problème pour les prochains...



--
Christian Laborde
La Révolution citoyenne, c'est sur : http://c.lab.over-blog.com/
Le forum des électrons libres :
http://electrons-libres.forumactif.fr
True E-mail : remove -no-spam-
Sentier des Vinches
CH 1091 Grandvaux
Suisse
Avatar
Daniel Moyne
Christian Laborde wrote:

Est-ce que l'objet enregistré est bien l'objet modifié ?

Quel est le lien entre l'objet document et l'objet
documentRoot ?
Salut


oui pour autant que je sache sinon je ne pourrais pas travailler sur les élements ; je pensais que l'idée de Yliur était la bonne car de mémoire c'est un classico quand on ne purge pas un buffer de sortie sinon les modifs restent dans le buffer de travail.

je ne sais pas quoi faire.
Yliur a écrit :
Daniel Moyne a écrit :
Qui connaît bien JDOM ? ; je lis un fichier XML (file) sans problème
avec :
/* création instance de SAXBuilder */
sxb = new SAXBuilder();
document = sxb.build(file);
documentRoot = (new SAXBuilder()).build(file).getRootElement();

Puis je map les élements qui m'intéressent :
Map<Integer, Element> my_rawMap = new HashMap<Integer, Element>();
records = documentRoot.getChild(MARRIAGE_XML_RECORDS);
List myrecords = records.getChildren();
Iterator iterator = myrecords.iterator();
while (iterator.hasNext()) {
Object next = iterator.next();
Element element = (Element) next;
my_rawMap.put(Integer.parseInt(element.getAttributeValue(JDOM.MARRIAGE_XML_RECORD_INDEX)),
element);
}
marriageRecordElementOrderedMap = new TreeMap(my_rawMap);

Jusque-là aucun problème.

Ensuite je fais des mises à jour sur les éléments de map là encore
sans problème.

Quand je sauve mon fichier avec :
try {
/* définition affichage classique avec getPrettyFormat() */
XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat());
/* enregistrement dans fichier */
sortie.output(document, new FileOutputStream(newFile));
} catch (IOException ee) {
throw new RuntimeException(ee.getMessage());
}

En fait je sauve ce que j'ai chargé sans plus aucunes des
modifications n'apparaît dans le fichier output ; jusqu'à maintenant
l'essentiel des modififations sont du type :
element_du_map.setAttribute("Attribut", "valeur_attribut");

mais il y en aura d'autres.

L'erreur est où quand je travaille sur les élements est-ce que je
travaille sur bien sur "document" ou alors sur quoi ?

Amicalement.




Peut-être fermer le flux d'écriture ?

OutputStream ecr = new FileOutputStream (newFile) ; // Avec un
petit tempon c'est mieux (-> BufferedOutputStream)
sortie.output (document, ecr) ;
ecr.close() ;

Et pester contre developpez.com si c'est là que vous avez pioché votre
exemple ;) .
Ou plus simplement leur signaler le problème pour les prochains...






--
Daniel Moyne (Nulix) |||// Machine : x86_64
Distribution : Ubuntu Feisty Fawn / --- ATI Radeon X300
kernel : 2.6.20-16-generic (' o-o ') KDE 3.5.7
--------------------------------oOO-(_)-OOo---------------------------------
Avatar
Christian Laborde
Il semble manquer une partie du code pour la compréhension.
Pourquoi deux new SAXBuilder() ?
Salut

Daniel Moyne a écrit :
Christian Laborde wrote:

Est-ce que l'objet enregistré est bien l'objet modifié ?

Quel est le lien entre l'objet document et l'objet
documentRoot ?
Salut


oui pour autant que je sache sinon je ne pourrais pas travailler sur les élements ; je pensais que l'idée de Yliur était la bonne car de mémoire c'est un classico quand on ne purge pas un buffer de sortie sinon les modifs restent dans le buffer de travail.

je ne sais pas quoi faire.
Yliur a écrit :
Daniel Moyne a écrit :
Qui connaît bien JDOM ? ; je lis un fichier XML (file) sans problème
avec :
/* création instance de SAXBuilder */
sxb = new SAXBuilder();
document = sxb.build(file);
documentRoot = (new SAXBuilder()).build(file).getRootElement();

Puis je map les élements qui m'intéressent :
Map<Integer, Element> my_rawMap = new HashMap<Integer, Element>();
records = documentRoot.getChild(MARRIAGE_XML_RECORDS);
List myrecords = records.getChildren();
Iterator iterator = myrecords.iterator();
while (iterator.hasNext()) {
Object next = iterator.next();
Element element = (Element) next;
my_rawMap.put(Integer.parseInt(element.getAttributeValue(JDOM.MARRIAGE_XML_RECORD_INDEX)),
element);
}
marriageRecordElementOrderedMap = new TreeMap(my_rawMap);

Jusque-là aucun problème.

Ensuite je fais des mises à jour sur les éléments de map là encore
sans problème.

Quand je sauve mon fichier avec :
try {
/* définition affichage classique avec getPrettyFormat() */
XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat());
/* enregistrement dans fichier */
sortie.output(document, new FileOutputStream(newFile));
} catch (IOException ee) {
throw new RuntimeException(ee.getMessage());
}

En fait je sauve ce que j'ai chargé sans plus aucunes des
modifications n'apparaît dans le fichier output ; jusqu'à maintenant
l'essentiel des modififations sont du type :
element_du_map.setAttribute("Attribut", "valeur_attribut");

mais il y en aura d'autres.

L'erreur est où quand je travaille sur les élements est-ce que je
travaille sur bien sur "document" ou alors sur quoi ?

Amicalement.



Peut-être fermer le flux d'écriture ?

OutputStream ecr = new FileOutputStream (newFile) ; // Avec un
petit tempon c'est mieux (-> BufferedOutputStream)
sortie.output (document, ecr) ;
ecr.close() ;

Et pester contre developpez.com si c'est là que vous avez pioché votre
exemple ;) .
Ou plus simplement leur signaler le problème pour les prochains...








--
Christian Laborde
La Révolution citoyenne, c'est sur : http://c.lab.over-blog.com/
Le forum des électrons libres :
http://electrons-libres.forumactif.fr
True E-mail : remove -no-spam-
Sentier des Vinches
CH 1091 Grandvaux
Suisse
Avatar
Yliur
Pour le tampon, c'est très grave quand on utilise explicitement un tampon
Java (BufferedOutputStream par exemple). Sinon je ne sais pas, ça dépend
si le système gère lui aussi un tampon et ne valide pas l'écriture... En
tout cas il vaut mieux fermer systématiquement les flux pour être sûr
(et avoir un code qui fonctionne encore si on ajoute un tampon :) ).

Et en reprenant sur un exemple plus simple ?
Est-ce quelque chose comme ça marche ?

"
/* lecture du document */
sxb = new SAXBuilder();
document = sxb.build(file);

/* réécriture du document */
try {
/* définition affichage classique avec getPrettyFormat() */
XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat());
/* enregistrement dans fichier */
OutputStream ecr = new FileOutputStream (newFile) ;
sortie.output (document, ecr) ;
ecr.close() ;
} catch (IOException ee) {
throw new RuntimeException(ee.getMessage());
}
"

Je pense comme Christian qu'il manque un bout du code ou qu'il y en
a en trop.
Si documentRoot ne sert qu'à représenter la racine du document sur lequel
travailler, ceci devrait être plus approprié (pour récupérer la racine
du document qui vient d'être chargé) :
documentRoot = document.getRootElement() ;



Daniel Moyne a écrit :
Christian Laborde wrote:

Est-ce que l'objet enregistré est bien l'objet modifié ?

Quel est le lien entre l'objet document et l'objet
documentRoot ?
Salut


oui pour autant que je sache sinon je ne pourrais pas travailler sur les élements ; je pensais que l'idée de Yliur était la bonne car de mémoire c'est un classico quand on ne purge pas un buffer de sortie sinon les modifs restent dans le buffer de travail.

je ne sais pas quoi faire.
Yliur a écrit :
Daniel Moyne a écrit :
Qui connaît bien JDOM ? ; je lis un fichier XML (file) sans problème
avec :
/* création instance de SAXBuilder */
sxb = new SAXBuilder();
document = sxb.build(file);
documentRoot = (new SAXBuilder()).build(file).getRootElement();

Puis je map les élements qui m'intéressent :
Map<Integer, Element> my_rawMap = new HashMap<Integer, Element>();
records = documentRoot.getChild(MARRIAGE_XML_RECORDS);
List myrecords = records.getChildren();
Iterator iterator = myrecords.iterator();
while (iterator.hasNext()) {
Object next = iterator.next();
Element element = (Element) next;
my_rawMap.put(Integer.parseInt(element.getAttributeValue(JDOM.MARRIAGE_XML_RECORD_INDEX)),
element);
}
marriageRecordElementOrderedMap = new TreeMap(my_rawMap);

Jusque-là aucun problème.

Ensuite je fais des mises à jour sur les éléments de map là encore
sans problème.

Quand je sauve mon fichier avec :
try {
/* définition affichage classique avec getPrettyFormat() */
XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat());
/* enregistrement dans fichier */
sortie.output(document, new FileOutputStream(newFile));
} catch (IOException ee) {
throw new RuntimeException(ee.getMessage());
}

En fait je sauve ce que j'ai chargé sans plus aucunes des
modifications n'apparaît dans le fichier output ; jusqu'à maintenant
l'essentiel des modififations sont du type :
element_du_map.setAttribute("Attribut", "valeur_attribut");

mais il y en aura d'autres.

L'erreur est où quand je travaille sur les élements est-ce que je
travaille sur bien sur "document" ou alors sur quoi ?

Amicalement.



Peut-être fermer le flux d'écriture ?

OutputStream ecr = new FileOutputStream (newFile) ; // Avec un
petit tempon c'est mieux (-> BufferedOutputStream)
sortie.output (document, ecr) ;
ecr.close() ;

Et pester contre developpez.com si c'est là que vous avez pioché votre
exemple ;) .
Ou plus simplement leur signaler le problème pour les prochains...







Avatar
Christian Laborde
Je pense qu'il y a deux objets distincts qui contiennent les
même données initiales. Donc l'objet sauvegardé ne contient
pas les données modifiées.

Yliur a écrit :
Pour le tampon, c'est très grave quand on utilise explicitement un tampon
Java (BufferedOutputStream par exemple). Sinon je ne sais pas, ça dépend
si le système gère lui aussi un tampon et ne valide pas l'écriture... En
tout cas il vaut mieux fermer systématiquement les flux pour être sûr
(et avoir un code qui fonctionne encore si on ajoute un tampon :) ).

Et en reprenant sur un exemple plus simple ?
Est-ce quelque chose comme ça marche ?

"
/* lecture du document */
sxb = new SAXBuilder();
document = sxb.build(file);

/* réécriture du document */
try {
/* définition affichage classique avec getPrettyFormat() */
XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat());
/* enregistrement dans fichier */
OutputStream ecr = new FileOutputStream (newFile) ;
sortie.output (document, ecr) ;
ecr.close() ;
} catch (IOException ee) {
throw new RuntimeException(ee.getMessage());
}
"

Je pense comme Christian qu'il manque un bout du code ou qu'il y en
a en trop.
Si documentRoot ne sert qu'à représenter la racine du document sur lequel
travailler, ceci devrait être plus approprié (pour récupérer la racine
du document qui vient d'être chargé) :
documentRoot = document.getRootElement() ;



Daniel Moyne a écrit :
Christian Laborde wrote:

Est-ce que l'objet enregistré est bien l'objet modifié ?

Quel est le lien entre l'objet document et l'objet
documentRoot ?
Salut


oui pour autant que je sache sinon je ne pourrais pas travailler sur
les élements ; je pensais que l'idée de Yliur était la bonne car de
mémoire c'est un classico quand on ne purge pas un buffer de sortie
sinon les modifs restent dans le buffer de travail.

je ne sais pas quoi faire.
Yliur a écrit :
Daniel Moyne a écrit :
Qui connaît bien JDOM ? ; je lis un fichier XML (file) sans problème
avec :
/* création instance de SAXBuilder */
sxb = new SAXBuilder();
document = sxb.build(file);
documentRoot = (new SAXBuilder()).build(file).getRootElement();

Puis je map les élements qui m'intéressent :
Map<Integer, Element> my_rawMap = new HashMap<Integer, Element>();
records = documentRoot.getChild(MARRIAGE_XML_RECORDS);
List myrecords = records.getChildren();
Iterator iterator = myrecords.iterator();
while (iterator.hasNext()) {
Object next = iterator.next();
Element element = (Element) next;
my_rawMap.put(Integer.parseInt(element.getAttributeValue(JDOM.MARRIAGE_XML_RECORD_INDEX)),

element);
}
marriageRecordElementOrderedMap = new TreeMap(my_rawMap);

Jusque-là aucun problème.

Ensuite je fais des mises à jour sur les éléments de map là encore
sans problème.

Quand je sauve mon fichier avec :
try {
/* définition affichage classique avec getPrettyFormat() */
XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat());
/* enregistrement dans fichier */
sortie.output(document, new FileOutputStream(newFile));
} catch (IOException ee) {
throw new RuntimeException(ee.getMessage());
}

En fait je sauve ce que j'ai chargé sans plus aucunes des
modifications n'apparaît dans le fichier output ; jusqu'à maintenant
l'essentiel des modififations sont du type :
element_du_map.setAttribute("Attribut", "valeur_attribut");

mais il y en aura d'autres.

L'erreur est où quand je travaille sur les élements est-ce que je
travaille sur bien sur "document" ou alors sur quoi ?

Amicalement.



Peut-être fermer le flux d'écriture ?

OutputStream ecr = new FileOutputStream (newFile) ; // Avec un
petit tempon c'est mieux (-> BufferedOutputStream)
sortie.output (document, ecr) ;
ecr.close() ;

Et pester contre developpez.com si c'est là que vous avez pioché votre
exemple ;) .
Ou plus simplement leur signaler le problème pour les prochains...










--
Christian Laborde
La Révolution citoyenne, c'est sur : http://c.lab.over-blog.com/
Le forum des électrons libres :
http://electrons-libres.forumactif.fr
True E-mail : remove -no-spam-
Sentier des Vinches
CH 1091 Grandvaux
Suisse
Avatar
Daniel Moyne
Yliur wrote:

Pour le tampon, c'est très grave quand on utilise explicitement un tampon
Java (BufferedOutputStream par exemple). Sinon je ne sais pas, ça
dépend si le système gère lui aussi un tampon et ne valide pas
l'écriture... En tout cas il vaut mieux fermer systématiquement les
flux pour être sûr (et avoir un code qui fonctionne encore si on ajoute
un tampon :) ).

Et en reprenant sur un exemple plus simple ?
Est-ce quelque chose comme ça marche ?

"
/* lecture du document */
sxb = new SAXBuilder();
document = sxb.build(file);

/* réécriture du document */
try {
/* définition affichage classique avec getPrettyFormat() */
XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat());
/* enregistrement dans fichier */
OutputStream ecr = new FileOutputStream (newFile) ;
sortie.output (document, ecr) ;
ecr.close() ;
} catch (IOException ee) {
throw new RuntimeException(ee.getMessage());
}
"

Je pense comme Christian qu'il manque un bout du code ou qu'il y en
a en trop.
Si documentRoot ne sert qu'à représenter la racine du document sur lequel
travailler, ceci devrait être plus approprié (pour récupérer la racine
du document qui vient d'être chargé) :
documentRoot = document.getRootElement() ;



Je vais essayer ce bout de code dans la soirée pour voir avec File = NewFile.
Amicalement.
Avatar
Daniel Moyne
Christian Laborde wrote:

Il semble manquer une partie du code pour la compréhension.
Pourquoi deux new SAXBuilder() ?
Salut


oui efectivement cette incongruïté pourrait expliquer le problème car cette instruction crée evidemment une une nouvelle instance de documentRoot non liée à document sue laquelle je travaille mais c'est celle liée à document qui est sauvée au moins c'est ce à quoi je crois pour l'instant : merci Christian je nettoie cela et je rapporte d'ici demain

Merci.
Avatar
Daniel Moyne
Christian Laborde wrote:

Il semble manquer une partie du code pour la compréhension.
Pourquoi deux new SAXBuilder() ?
Salut


Merci, christian c'était bien ça maintenant je sauve un fichier avec des modifictions ; pas de problème de buffer.

Reste que dans le fichier lu il a ce type d'en-tete :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE CONTENT [
<!ELEMENT CONTENT (HEADER, RECORDS)>
<!ELEMENT HEADER (#PCDATA)>
<!ELEMENT RECORDS (#PCDATA)>
<!ENTITY nom_de_l_entite "Contenu de l'entite">
]>


et à la sauvegarde cela uniquement :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE CONTENT>

où donc tous les composants <!ELEMENT .....> sont absents.

Une explication ?

Je continue avec des questions séparées dans un autre thème.

Daniel.