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

XML Java Discussion :

Lecture fichier XML via Java


Sujet :

XML Java

  1. #1
    Nouveau membre du Club
    Lecture fichier XML via Java
    Bonjour tous le monde ! Je reviens vers vous cette fois ci pour un petit problème ! J'explique tout d'abord mon projet : Je suis en train de créer une application Java, sous Netbeans, qui permettra de compléter un fichier excel en fonction de la lecture d'un fichier XML.

    Où j'en suis ? J'arrive à écrire/créer/éditer un fichier Excel. J'arrive à choisir quel fichier XML je veux, cependant, là où j'ai du mal c'est sur la lecture du fichier XML.

    J'ai un fichier comme ceci :

    Code XML :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <etiquette>
    <client num="52121211"/> <!-- Numéro du client -->
    <modele type=1"/>
    <taille witdh="454"/>
    </etiquette>


    Et mon programme ressemble à 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
    45
    package xml.java;
     
    import java.io.File;
    import java.io.IOException;
    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.Node;
    import org.w3c.dom.NodeList;
    import org.xml.sax.SAXException;
     
    public class XMLJAVA {
     
        public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
            final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            try {
                final DocumentBuilder builder = factory.newDocumentBuilder();
                final Document document = builder.parse(new File("C:/Users/stagibe/Desktop/exempleLOI.xml"));
     
                //Affiche l'élément racine
                final Element racine = document.getDocumentElement();
     
                final NodeList racineNoeuds = racine.getChildNodes();
     
                final int nbRacineNoeuds = racineNoeuds.getLength();
     
                for (int i = 0; i < nbRacineNoeuds; i++) {
                    if (racineNoeuds.item(i).getNodeType() == Node.ELEMENT_NODE) {
                        final Element client = (Element) racineNoeuds.item(i);
                        System.out.println("n client : " + client.getAttribute("num"));
                        final Element modele = (Element) racineNoeuds.item(i);
                        System.out.println("modèle : " + modele.getAttribute("type"));
                        final Element taille = (Element) racineNoeuds.item(i);
                        System.out.println("taille : " + modele.getAttribute("width"));
                    }
                }
     
            } catch (final ParserConfigurationException | SAXException | IOException e) {
            }
     
        }
     
    }


    Cependant, j'ai un problème en exécutant ce programme. Voici ce que j'ai d'afficher dans la console :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    n client : 52121211
    modèle :
    taille :
    n client :
    modèle : 1
    taille :
    n client :
    modèle :
    taille : 454


    En fait, mon programme lis tous le document pour rechercher un SEUL attribut, puis refait ceci pour le suivant, puis recommence pour le dernier. Mais j'aimerai que mon programme lises directement les attributs du document complet directement à la suite. J'aimerais une seule lecture du fichier.

    Je ne comprends pas ce que je dois faire.

  2. #2
    Membre chevronné
    Plutôt que de faire du DOM, utilise les API JAXB ou SAX pour parser ton fichier XML

    https://jmdoudoux.developpez.com/cou...-jaxb.php#jaxb
    https://jmdoudoux.developpez.com/cou...ap-sax.php#sax
    Je ne suis pas mort, j'ai du travail !

  3. #3
    Nouveau membre du Club
    Citation Envoyé par eulbobo Voir le message
    Plutôt que de faire du DOM, utilise les API JAXB ou SAX pour parser ton fichier XML
    En quoi il est mieux d'utiliser ces API là ? Quelles sont leurs avantages par rapport au DOM ? A ce que j'ai vu dans la programmation, et dans les liens que tu m'as donné, le DOM m'as l'air plus simple mais je vais essayer les autres.

    Dans le lien SAX que tu m'as donnée, je trouve comment récupérer des valeurs entre des éléments mais il n'y as pas de partie pour récupérer les attributs.

  4. #4
    Membre émérite
    Chaque passe du boucle ramasse un noeud qui peut être un élément ou pas un élément, d'ailleurs, et c'est ça que veut dire la combinaison d'usage avec .getChildNodes() et .item(i) et le test avec .getNodeType().
    Code java :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
                for (int i = 0; i < nbRacineNoeuds; i++) {
                    if (racineNoeuds.item(i).getNodeType() == Node.ELEMENT_NODE) {
                        final Element elem = (Element) racineNoeuds.item(i);
                        switch(elem.getTagName()) {
                            case "client":
                                System.out.println("n client : " + elem.getAttribute("num"));
                                break;
                            case "modele":
                                System.out.println("modèle : " + elem.getAttribute("type"));
                                break;
                            case "taille":
                                System.out.println("taille : " + elem.getAttribute("width"));
                                break;
                            default:
                                break;
                        }
                    }
                }

  5. #5
    Nouveau membre du Club
    Merci beaucoup pour l'explication et pour le code ! Mon programme marche très bien, plus qu'à l'adapter à mon besoin maintenant !!

  6. #6
    Modérateur

    Citation Envoyé par tomlrt53 Voir le message
    En quoi il est mieux d'utiliser ces API là ? Quelles sont leurs avantages par rapport au DOM ? A ce que j'ai vu dans la programmation, et dans les liens que tu m'as donné, le DOM m'as l'air plus simple mais je vais essayer les autres.
    Ben justement non, DOM n'est pas plus simple. En fait, DOM est extrêmement malaisé d'emploi, c'est son seul défaut mais c'est le défaut qui le définit, car c'est simplement ridicule à quel point il est compliqué de s'en servir.

    L'intérêt de quoi que ce soit d'autre que DOM, c'est que ça n'a pas le même défaut d'être compliqué sans raison comme ça.

    Mais bon, moi je ne recommanderais pas JAXB ni SAX. Je recommanderais JDOM 2.

    - JDOM 2 : c'est ce que le DOM aurait dû être en Java. Même principe, mêmes fonctionnalités, mais fait de sorte que ce soit utilisable et simple. Dans un monde où JDOM 2 existe, l'existence de DOM en Java n'a simplement aucun intérêt.

    - SAX : L'idée de SAX c'est de ne pas charger le fichier XML entièrement en mémoire, mais de lire ses éléments l'un après l'autre. C'est utile dans certains cas mais ce n'est pas vraiment ce qui t'arrange ici, donc bon, à oublier. De plus SAX est également trop compliqué à utiliser. Pour la même chose sur le même principe que SAX, c'est StAX qu'il faut utiliser, mêmes intérêts mais simple d'emploi.

    - JAXB : une manière de lire le XML en définissant des classes qui représentent le format du XML, du coup "lire un XML" crée une instance de la classe en question. Très pratique dans de nombreux cas, personnellement j'estime que ça demande trop de travail à mettre en place dans la situation que tu as, toi.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Nouveau membre du Club
    D'accord, donc je ne m'étais pas trompé en disant que SAX ou JAXB était trop complexe pour mon utilisation. Je vais regarder du côté de JDOM2 si ça peut alléger mon programme et le simplifier (simplifier surtout la compréhension).

    Merci tout de même pour ce comparatif.