IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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 :

Parcourir une arborescence XML avec JDom


Sujet :

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

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 127
    Points : 48
    Points
    48
    Par défaut Parcourir une arborescence XML avec JDom
    Bonjour,

    Mon problème réside dans le fait que je veux parser un fichier xml et traiter les noeuds de profondeur 3 et 4 mais je n'ai pas pu le faire.

    Pour le noeud de profondeur 2 ça marche sans probleme, mais je n'ai pas pu résoudre le probleme de profondeur 3!

    Donc mon programme, lit un fichier sys.xml, et génère un deuxieme fichier cp.xml

    voici mon code

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
     
     
    package ProjectPackage;
     
    /**
     *
     * @author sousou
     */
    import java.io.*;
    import org.jdom.*;
    import org.jdom.input.*;
    import org.jdom.filter.*;
    import java.util.List;
    import java.util.Iterator;
    import org.jdom.output.Format;
    import org.jdom.output.XMLOutputter;
     
     
    public class ParserSysEquation {
     
        static Element racine = new Element("work");
     
        //On crée un nouveau Document JDOM basé sur la racine que l'on vient de créer
        static org.jdom.Document document = new Document(racine);
     
     
        public static void listChildren(Document d) {
     
            //On crée un nouvel Element cp et on l'ajoute
            //en temps qu'Element de racine
            Element cp = new Element("cp");
            racine.addContent(cp);
     
            //On crée un nouvel Element page, 
            //et on l'ajoute en temps qu'Element de cpnet
     
            Element page = new Element("page");
            cp.addContent(page);
     
            //On crée un nouvel Attribut classe et on l'ajoute à page
            //grâce à la méthode setAttribute
            Attribute idpage = new Attribute("id","ID6");
            page.setAttribute(idpage);
     
            Iterator i = d.getRootElement().getChildren().iterator();
            while (i.hasNext()) {
                String url;
     
                org.jdom.Element e = (Element)i.next(); 
     
                url = e.getAttributeValue("idvars");
     
                String idvars = e.getChildText("idvars");
                if (idvars==null) System.out.println("Pas de idvars");
                else System.out.println(""+idvars);
     
                Element place = new Element("place");
                page.addContent(place);
     
                Element idv= new Element("idv");
                // idv.setText(url);
                place.addContent(url);
     
                //Les deux méthodes qui suivent seront définies plus loin dans l'article
            }
     
        }
     
     
        public static void main(String[] args) {
     
            SAXBuilder builder = new SAXBuilder();
     
            try {
                Document doc = builder.build("sys.xml");
                listChildren(doc);
            }
            catch (JDOMException e) {
                System.out.println("sys.xml is not well-formed.");
                System.out.println(e.getMessage());
            }
            catch (IOException e) {
                System.out.println(e);
            }
     
        }
     
     
    }
    le fichier sys.xml
    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
     
    <?xml version="1.0"?>
    <systeme>
    	<eq idvars="v2 v3" idconsts="c1">
    		<fct nom="f1" ref="v1">
    			<cst nom="c1">
    				<c_value>438</c_value>
    				<c_coef>1</c_coef>
    			</cst>
    			<var nom="v2">
    				<value>45</value>
    				<coef>3</coef>
    			</var>
    			<var nom="v3">
    				<value>0</value>
    				<coef>1</coef>
    			</var>
    		</fct>
    	</eq>
     
    	<eq idvars="v1" idconsts="c2">
    		<fct nom="f2" ref="v2">
    			<cst nom="c2">
    				<c_value>43</c_value>
    				<c_coef>2</c_coef>
    			</cst>
    			<var nom="v1">
    				<value>45</value>
    				<coef>3</coef>
    			</var>
    		</fct>
    	</eq>
    </systeme>
    Je veux traiter l"element cst, mais je n'arrive pas a le faire. Tout ce que je peux traiter c'est l'element eq. avec getRootElement().getChildren(), j'ai inséré getChildren("fct") mais ça marche pas!

    Est ce que vous avez une solution svp?
    MErci

  2. #2
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 534
    Points : 562
    Points
    562
    Par défaut
    Bonjour,

    Il serait bien de:
    - dans l'entête (première ligne), l'ạout de l'encodage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?xml version="1.0" encoding="utf-8"?>
    - séparer la lecture XML et l'écriture en 2 fonctions différentes.

    - avoir un XSD définissant ton schéma pour entrée et sortie. Avec ceci tu peux analyser, extraire les eléments plus facilement....

    Pour parcourir un XML document avec Jdom, tu peux faire comme ceci, après c'est à toi de extraire les éléments ou données selon tes besoins.

    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
    
    xm
    public void testJdom(String fileName)
    {
        Document document = null;
        File   file = new File(fileName);
        SAXBuilder builder = new SAXBuilder();
        try
        {
            document = builder.build(file); 
            Element root = document.getRootElement();
            List children = root.getChildren();
            for (Object obj : children)
            {
                Element child = (Element)obj;
                //Extraire les donnees (attributes, values ...) ou parcourir en 
                // profondeur en fonction de child (noeud terminal ou arbre ....) 
            }
       
        }
        catch (JDOMException e) 
        {
            System.err.println(e.getMessage());
        }
        catch (IOException e) 
        {
            System.err.println(e.getMessage());
        }
    
    }
    

  3. #3
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 127
    Points : 48
    Points
    48
    Par défaut
    Merci pour votre réponse.

    Finalement cet exemple m'a aidé beaucoup !

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    import org.jdom.*;
    import org.jdom.input.SAXBuilder;
    import java.io.IOException;
    import java.util.*;
     
     
    public class ElementLister {
     
      public static void main(String[] args) {
     
        if (args.length == 0) {
          System.out.println("Usage: java ElementLister URL"); 
          return;
        } 
     
        SAXBuilder builder = new SAXBuilder();
     
        try {
          Document doc = builder.build(args[0]);
          Element root = doc.getRootElement();
          listChildren(root, 0);      
        }
        // indicates a well-formedness error
        catch (JDOMException e) { 
          System.out.println(args[0] + " is not well-formed.");
          System.out.println(e.getMessage());
        }  
        catch (IOException e) { 
          System.out.println(e);
        }  
     
      }
     
     
      public static void listChildren(Element current, int depth) {
     
        printSpaces(depth);
        System.out.println(current.getName());
        List children = current.getChildren();
        Iterator iterator = children.iterator();
        while (iterator.hasNext()) {
          Element child = (Element) iterator.next();
          listChildren(child, depth+1);
        }
     
      }
     
      private static void printSpaces(int n) {
     
        for (int i = 0; i < n; i++) {
          System.out.print(' '); 
        }
     
      }
     
    }
    source: http://www.cafeconleche.org/books/xm...s/ch14s08.html

    sinon pourquoi XSD m'aidera a extraire les elements plus facilement? je pense que c'est la meme chose! non?

  4. #4
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 534
    Points : 562
    Points
    562
    Par défaut

    sinon pourquoi XSD m'aidera a extraire les elements plus facilement? je pense que c'est la meme chose! non?
    Avec XSD, on peut connaitre la structure des donnees a extraire et on ecrit le programme correspondant. Sinon il faut avoir un programme generique pour parcourir l'entree XML.

Discussions similaires

  1. [JDOM] Parcourir les éléments d'un fichier XML avec JDOM
    Par pomolo11 dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 13/12/2013, 23h39
  2. [JDOM] Comment insérer une image .jpg dans un fichier xml avec JDOM ?
    Par Ardillon dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 05/07/2013, 15h08
  3. se pointer sur un noeud enfant dans une arborescence XML avec Java
    Par PrFaToum dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 08/06/2012, 13h39
  4. [JDOM] Récupérer le nom d'une balise XML avec JDOM
    Par cendrine15 dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 10/04/2012, 15h18
  5. Parcourir visuellement une arborescence XML
    Par fabrice91 dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 04/03/2011, 08h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo