Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Format d'échange (XML, JSON...) Java Discussion :

Probleme de lecture d'un fichier xml avec java avec l'API DOM


Sujet :

Format d'échange (XML, JSON...) Java

  1. #1
    Membre du Club
    Probleme de lecture d'un fichier xml avec java avec l'API DOM
    Bonjour;

    Je suis entrain de réaliser un petit programme en java pour lire un fichier XML, mais le problème est que, j'ai un message d'erreur qui me dit qu'il ne trouve pas mon fichier xml alors que mon fichier xml et mon fichier java se trouve dans le même répertoire.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    package test;
     
    import java.io.IOException;
     
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;
    import javax.swing.*;
    import org.w3c.dom.*;
    import org.xml.sax.SAXException;
     
    public class LectureXmll {
     
    	public static void main(String[] args) {
     
    		try {
     
    			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    			DocumentBuilder builder = factory.newDocumentBuilder();
    			Document document = builder.parse("fichier.xml");
    			NodeList elements =  document.getElementsByTagName("");
    			Element elementClient = (Element)elements.item(0);
    			String message = "nom"+elementClient.getAttribute("nom");
    			Text donneesTexte = (Text)elementClient.getFirstChild();
    			message += donneesTexte.getData();
    			JOptionPane.showMessageDialog(null, message);
     
    		}catch(ParserConfigurationException | SAXException|IOException ex){
    			JOptionPane.showMessageDialog(null, "Probleme "+ex.getMessage());
     
    		}
    	}
     
    }

    Voici une partie du code du fichier XML, le nom du fichier est: fichier.xml
    Code XML :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    <conf>
     
    		<fab type="fabric-matiere1ere">
    			<icones>
    				<icone type="vide" path="src/image/fa0%.png"/>
    				<icone type="un-tier" path="src/image/fa33%.png"/>
    				<icone type="deux-tiers" path="src/image/fa66%.png"/>
    				<icone type="plein" path="src/image/fa100%.png"/>
    			</icones>
    			<sortie type = "matiere1ere"/>
    			<temp-production>100</temp-production>
    		</fab>
    		<fab type="fab-autre">
    			<ic>
    				<icone type="vide" path="src/image/ba0%.png"/>
    				<icone type="letier" path="src/image/ba33%.png"/>
    				<icone type="moitie" path="src/image/ba66%.png"/>
    				<icone type="plein" path="src/image/ba100%.png"/>
    			</ic>
    			<entree type="metal" quantite="2"/>
    			<sortie type="autre"/>
    			<temp-production>50</temp-production>
    		</fab>
    </conf>

    Je souhaite récupérer les chiffres par exemple le 50 et le 100,... les mettrent dans une variable.
    Une dernière question,
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    <icone type="plein" path="src/image/ba100%.png"/>
    cette ligne indique le chemin d'une image et ce que c'est possible de récupérer cette image avec java en passant par la lecture du fichier xml et l'afficher dans ma boite de dialogue swing, comme la récupération des chiffres, si oui quel est le moyen le plus simple?
    Merci d'avance, j'ai passé plusieurs heures à chercher sur google mais en vain.
    Une capture d'ecran:

  2. #2
    Modérateur

    Hello,

    Citation Envoyé par Khalfe Voir le message
    alors que mon fichier xml et mon fichier java se trouve dans le même répertoire.
    Ben justement...

    Un fichier Java ça doit normalement être dans le classpath, c'est-à-dire à vocation d'être assemblé dans une archive .jar.
    Alors qu'un fichier de ressource normal, ça doit être un simple fichier du disque dur.

    Donc, forcément, pas au même endroit...

    Pour tester il suffit que tu mettes ton fichier XML à la racine du projet. Pas dans test, pas dans src, mais dans Lab01. Enfin, par défaut, hein. Après ça dépend ce que tu configures comme répertoire de travail quand tu lances ton programme. Il faut que ton fichier XML soit dans le répertoire de travail.

    Mais bon, ça c'était pour tester.

    En pratique c'est peut-être une bonne chose que ton fichier XML fasse partie du programme et soit assemblé dans un .jar à la fin avec le reste du programme. Bref qu'il soit aussi dans le classpath et avec tes fichiers .java...
    Mais dans ce cas tu peux pas le charger avec DocumentBuilder.parse(String), qui n'accepte que des URI... et les URI vers le classpath, ça n'existe pas.

    Il faut utiliser DocumentBuilder.parse(InputStream), et que ce soit toi qui te charges de charger le fichier dans un InputStream. Le DocumentBuilder, lui il ne s'occupe que de le parser.

    Quelque chose de ce genre :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    try(InputStream stream = LectureXmll.class.getResourceAsStream("fichier.xml")) {
     
      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
      DocumentBuilder builder = factory.newDocumentBuilder();
      Document document = builder.parse(stream);
     
      // ... traitement
     
    }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre du Club
    Merci pour ta réponse et tes explications,
    Je n'utilise pas le .jar dans le travail que je suis entrain de faire. J'ai un répertoire dans le quel j'ai les repertoires src et le ressource normalement.
    Le repertoire src contient les fichiers java et le repertoire ressource contient les autres fichiers xml, images....Mon fichier xml doit être normalement dans ressource, mais pour le moment c'est un test de lecture avant de le mettre dans sa place, d'ailleurs j'ai même essayer de le mettre dans son répertoire en utilisant le chemin /ressource/fichier.xml mais c'est pareil.

    En revenant sur ta réponse, j'ai essayé de mettre mon fichier xml dans répertoire racine Lab01 c'est pareil d'ailleurs j'ai changer le contenue du fichier xml pour faire plus simple comme suit
    Code XML :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?xml version="1.0" encoding="UTF-8"?>
    <contacts>
          <personne id="1">
                <nom>codeur</nom>
                <prenom>java</prenom>
                <phone>054124587</phone>
                <email>codeurjava@gmail.com</email>
          </personne>
          <personne id="2">
                <nom>codeur</nom>
                <prenom>c++</prenom>
                <phone>062148795</phone>
                <email>codeurcplusplus@gmail.com</email>
          </personne>
    </contacts>

    Mais ça ne change absolument rien.
    J'ai essayé aussi de modifier le code comme tu l'a suggeré avec le InputStream, mais là j'ai une exception

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    package test;
     
    import java.io.IOException;
     
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;
    import javax.swing.*;
     
    import org.omg.CORBA.portable.InputStream;
    import org.w3c.dom.*;
    import org.xml.sax.SAXException;
     
    public class LectureXmll {
     
    	public static void main(String[] args) {
     
    		try(InputStream stream = (InputStream) LectureXmll.class.getResourceAsStream("fichier.xml")) {
     
    			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    			DocumentBuilder builder = factory.newDocumentBuilder();
    			Document document = builder.parse(stream);
    			NodeList elements =  document.getElementsByTagName("");
    			Element elementClient = (Element)elements.item(0);
    			String message = "nom"+elementClient.getAttribute("nom");
    			Text donneesTexte = (Text)elementClient.getFirstChild();
    			message += donneesTexte.getData();
    			JOptionPane.showMessageDialog(null, message);
     
    		}catch(ParserConfigurationException | SAXException|IOException ex){
    			JOptionPane.showMessageDialog(null, "Probleme "+ex.getMessage());
     
    		}
    	}
     
    }

    Voici l'exception
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    Exception in thread "main" java.lang.IllegalArgumentException: InputStream cannot be null
    	at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)
    	at test.LectureXmll.main(LectureXmll.java:22)

    Je ne sais même plus quoi faire, je suis complètement perdu, hier j'ai passé toute ma journée dessus.
    Merci d'avance.

  4. #4
    Membre chevronné
    salut,
    as essaies ceci :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    import java.io.File;
    import java.io.IOException;
     
    import javax.swing.JOptionPane;
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;
     
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    import org.w3c.dom.NodeList;
    import org.w3c.dom.Text;
    import org.xml.sax.SAXException;
     
    public class LectureXmll {
     
    	public static void main(String[] args) {
     
            File fileXML = new File("fichier.xml");
    		try{
     
    			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    			DocumentBuilder builder = factory.newDocumentBuilder();
     
    			Document document = builder.parse(fileXML);
    			Element root = document.getDocumentElement();
    			System.out.println(root.getNodeName());
     
    			NodeList elements =  document.getElementsByTagName("nom");
    			Element elementClient = (Element)elements.item(0);
    			String message = "nom" + elementClient.getTextContent();
     
    	         Text donneesTexte = (Text)elementClient.getFirstChild();
    			message += donneesTexte.getData();
    			JOptionPane.showMessageDialog(null, message);
     
    		}catch(ParserConfigurationException | SAXException|IOException ex){
    			JOptionPane.showMessageDialog(null, "Probleme "+ex.getMessage());
     
    		}
    	}
     
    }


    Eric

  5. #5
    Modérateur

    @Khalfe :

    Quand tu essaies une chose, montre le code, et montre où sont les fichiers. Puis quand tu as une erreur ou n'importe quel résultat,
    copie/colle cette erreur et ce résultat.

    Ensuite explique en quoi consistait cet essai et ce qui te plaît, ne te plaît pas avec.

    Puis refait toutes ces mêmes choses avec l'essai suivant, et ainsi de suite.

    Nous ne pouvons pas t'aider si tu nous dis en substance, "bon ben j'ai essayé des trucs et ça ne marche pas."
    Pour chaque truc : le code, les fichiers, le résultat, une description.
    Pas essayer de faire le tout pour tout ce que tu as essayé. C'est inutile.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre du Club
    Merci à vous tous, en fait le fichier devait être dans un autre dossier et ajouter le chemin dans mon code.