Java enregistrer un fichier txt

gege.2007 Messages postés 25 Statut Membre -  
KX Messages postés 19031 Statut Modérateur -
Bonjour,
J'aimerais avoir un exemple de code Java qui permet de charger un fichier txt comme celui-ci

a, 155, 3, 3
b, 2236, 5, 6


Pour mettre à jour la quantité de ce fichier xml :

<?xml version="1.0" encoding="ISO-8859-1"?>
<personne>
<lettre code="3" prix="5.00" quantité= "2" />
<lettre code="5" prix="10.00" quantité= "4" />
</personne>


et obtenir:

<?xml version="1.0" encoding="ISO-8859-1"?>
<personne>
<lettre code="3" prix="5.00" quantité= "3" />
<lettre code="5" prix="10.00" quantité= "6" />
</personne>


Je vous remercie d'avance
Gege
A voir également:

2 réponses

KX Messages postés 19031 Statut Modérateur 3 020
 
Bonjour,

Pour comprendre ton exemple
b, 2236, 5, 6
il faudrait récupérer l'élément
<lettre code="5"/>
pour lui affecter la valeur
quantité= "6"
?

À quoi servent b et 2236 ?
1
gege.2007 Messages postés 25 Statut Membre
 
Bonjour KX, oui c'est exactement cela!
Pour la lettre et 2236 ou 155 on peut le voir comme le nom d'une personne et son ID, par contre cela n'est pas pris en compte dans le fichier xml puisque l'on s’intéresse seulement au code de la lettre ici 3 ou 5, au prix qui est toujours le même 5.00 ou 10.00 et à la quantité qui est ce que l'on doit mettre à jour.
0
KX Messages postés 19031 Statut Modérateur 3 020
 
Voici un code qui permet de lire le contenu de ton fichier.

Mais attention, pour Java, il est nécessaire que le XML soit bien formé, et pour cela il faudra enlever l'accent à
quantité
sinon tu auras une erreur.

import javax.xml.parsers.*;
import org.w3c.dom.*;

public class XML {

    public static void main(String[] args) throws Exception {
        Document doc = DocumentBuilderFactory.newInstance()
            .newDocumentBuilder().parse("c:/personne.xml");
        doc.getDocumentElement().normalize();
        NodeList lettres = doc.getElementsByTagName("lettre");

        for (int i = 0; i < lettres.getLength(); i++) {
            Element lettre = (Element) lettres.item(i);
            NamedNodeMap attributes = lettre.getAttributes();
            for (int j = 0; j < attributes.getLength(); j++) {
                Node attr = attributes.item(j);
                System.out.println(attr.getNodeName() + ": "
                    + attr.getNodeValue());
            }
            System.out.println();
        }
    }
}
1
gege.2007 Messages postés 25 Statut Membre
 
Super, merci beaucoup KX pour cet exemple et pour tes conseils.
Bonne soirée.
0
gege.2007
 
Salut, petit soucis c'est que le code en question ne modifie pas le fichier xml à partir des infos du fichier txt, j'ai essayé et ça ne fait que lire le fichier xml.
0
KX Messages postés 19031 Statut Modérateur 3 020
 
En effet, c'est d.ailleurs comme ça que j'ai présenté ce code, il permet de le lire, mais également d'extraire les bonnes valeurs au format XML ce qui permet de les modifier dans le DOM comme tu le souhaites avant d'écrire le nouveau contenu dans un fichier.
0
gege.2007 > KX Messages postés 19031 Statut Modérateur
 
Ah d'accord j'avais pas compris, merci.
Par contre si cela ne te dérange pas pourrais-tu me mettre le code complet avec la DOM aussi, car je suis en train d'apprendre et j'aurais vraiment besoin d'un exemple de ce type. merci beaucoup
0
KX Messages postés 19031 Statut Modérateur 3 020
 
Des exemples tu en as dans la documentation :
https://docs.oracle.com/javase/tutorial/jaxp/xslt/writingDom.html

J'ai repris le code précédent pour remplacer l'affichage par des setNodeValue et j'ai ajouté à la fin l'enregistrement du fichier.

import java.io.File;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.*;

public class XML {

    public static void main(String[] args) throws Exception {
        Document doc = DocumentBuilderFactory.newInstance()
            .newDocumentBuilder().parse("c:/personne.xml");
        doc.getDocumentElement().normalize();
        NodeList lettres = doc.getElementsByTagName("lettre");

        for (int i = 0; i < lettres.getLength(); i++) {
            Element lettre = (Element) lettres.item(i);
            NamedNodeMap attributes = lettre.getAttributes();

            Node code = attributes.getNamedItem("code");
            Node quantite = attributes.getNamedItem("quantite");
            if (code.getNodeValue().equals("3"))
                quantite.setNodeValue("3");
            if (code.getNodeValue().equals("5"))
                quantite.setNodeValue("6");
        }
        TransformerFactory.newInstance().newTransformer().transform(
            new DOMSource(doc), new StreamResult(new File("C:/personne2.xml")));
    }
}

Le XML résultat est :

<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?><personne>
 <lettre code="3" prix="5.00" quantite="3"/>
 <lettre code="5" prix="10.00" quantite="6"/>
 </personne>

Il te reste bien sûr encore un peu de travail à faire pour remplacer les if que j'ai mis en dur dans le code par les modifications que tu as mis ligne par ligne dans ton fichier txt.
0