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 :

XML, DefaultMutableTreeNode [JDOM]


Sujet :

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

  1. #1
    Membre régulier
    Profil pro
    Retraité
    Inscrit en
    Mars 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2010
    Messages : 35
    Points : 117
    Points
    117
    Par défaut XML, DefaultMutableTreeNode
    Bonjour,

    Cela fait plusieurs jours que je bataille avec mon fichier xml et mon JTree, que j'arrive à afficher, mais pas à gérer comme je le souhaite.
    Mon fichier XML est du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <monde>
    <zone nom="Océan Atlantique">
       <zone nom="Mer d'Irlande" />
       <zone nom="Golfe de Gascogne">
          <zone nom="Bassin d'Arcachon" />
       </zone>
    </zone>
    <zone nom="Mer Méditerranée">
       <zone nom="Golfe du Lion" />
    </zone>
    </monde>
    J'arrive à le lire tel quel, mais je n'arrive pas à le lire comme si il était de la forme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <monde>
    <Océan Atlantique>
       <Mer d'Irlande>
       <Golfe de Gascogne>
          <Bassin d'Arcachon>
       </Golfe de Gascogne>
    </Océan Atlantique>
    <Mer Méditerranée>
       <Golfe du Lion>
    </Mer Méditerranée>
    </monde>
    Si quelqu'un a une idée pour organiser d'une autre manière mon fichier XML tout en conservant le lien hiérarchique entre les zones, et/ou une idée du code JAVA qui me permettra d'alimenter mon JTree avec un arbre ressemblant au 2ème exemple, je suis volontier preneur.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 608
    Points
    21 608
    Par défaut
    Ben, la seule question c'est comment tu donnes des noms aux nœuds de ton JTree.
    Il suffit de lire l'attribut nom des éléments <zone>.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre régulier
    Profil pro
    Retraité
    Inscrit en
    Mars 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2010
    Messages : 35
    Points : 117
    Points
    117
    Par défaut
    Merci pour ton intérêt

    Un des problèmes est que le DefaultMutableTreeNode n'a pas de méthode setName ou quelque chose d'approchant. Voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DefaultMutableTreeNode top = new DefaultMutableTreeNode("geo.xml");								
    		try {
    			SAXParser saxParser = new SAXParser();
    			saxParser.setContentHandler(saxTree);
    			saxParser.parse("geo.xml");
    		} catch (Exception ex) {
    			top.add(new DefaultMutableTreeNode(ex.getMessage()));
    		}
    		listeTree = new JTree(saxTree.getTree());
    où saxtree est une classe dérivée de DefaultHandler.
    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
    import javax.swing.tree.DefaultMutableTreeNode;
    import org.xml.sax.Attributes;
    import org.xml.sax.helpers.DefaultHandler;
     
    public class SAXTreeBuilder extends DefaultHandler {
    	private DefaultMutableTreeNode currentNode = null;
    	private DefaultMutableTreeNode previousNode = null;
    	private DefaultMutableTreeNode rootNode = null;
     
    	public SAXTreeBuilder(DefaultMutableTreeNode root) {rootNode = root;}
     
    	public void startDocument() {currentNode = rootNode;}
     
    	public void endDocument() {}
     
    	public void startElement(String uri, String qName, String lName, Attributes atts) {
    		previousNode = currentNode;
    		currentNode = new DefaultMutableTreeNode(lName);
    		// Add attributes as child nodes //
    		attachAttributeList(currentNode, atts);
    		previousNode.add(currentNode);
    	}
     
    	public void endElement(String uri, String qName, String lName) {
    		if (currentNode.getUserObject().equals(lName))
    			currentNode = (DefaultMutableTreeNode) currentNode.getParent();
    	}
     
    	/**
             * reconstruit l'arbre au format désiré et le renvoie
             * 
             * @return DefaultMutableTreeNode l'arbre xml au format désiré: INCORRECT
             */
    	public DefaultMutableTreeNode getTree() {
    		DefaultMutableTreeNode retour = (DefaultMutableTreeNode) rootNode.getChildAt(0);
    		return retour;
    	}
     
    	private void attachAttributeList(DefaultMutableTreeNode node,
    			Attributes atts) {
    		for (int i = 0; i < atts.getLength(); i++) {
    			String name = atts.getLocalName(i);
    			String value = atts.getValue(name);
    			// node.add(new DefaultMutableTreeNode(name + " = " + value));
    			node.add(new DefaultMutableTreeNode(value));
    		}
    	}
    }
    On voit que l'attribut "nom" est transformé en une nouvelle feuille au lieu de changer le nom du noeud "zone" (c'est parce qu'il n'est pas possible de changer le nom du noeud). Et c'est le problème que je dois résoudre.

    listeTree donne quelque chose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    + monde
    |     + zone
    |     | Océan Atlantique
    |     |     + zone
    |     |     |     - Mer d'Irlande
    |     |     + zone
    |     |     |     - Golfe de Gascogne
    |     |     |     + zone
    |     |     |     |     - Bassin d'Arcachon
    |     + zone
    |     |     - Mer Méditerranée
    ...
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    + monde
    |     + Océan Atlantique
    |     |     - Mer d'Irlande
    |     |     + Golfe de Gascogne
    |     |     |     - Bassin d'Arcachon
    |     + Mer Méditerranée
    ...

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 608
    Points
    21 608
    Par défaut
    Je comprends pas pourquoi tu crées le nœud en l'appelant lName (le nom de l'élément, donc "zone",) au lieu de juste lui donner le bon nom extrait de la liste d'attributs.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre régulier
    Profil pro
    Retraité
    Inscrit en
    Mars 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2010
    Messages : 35
    Points : 117
    Points
    117
    Par défaut
    Parce que quand je parse la balise fermante, je trouve "zone" et non pas "Océan Atlantique" ou "Bassin d'Arcachon" ou tout autre nom de zone.

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 608
    Points
    21 608
    Par défaut
    Citation Envoyé par ji_louis Voir le message
    Parce que quand je parse la balise fermante, je trouve "zone" et non pas "Océan Atlantique" ou "Bassin d'Arcachon" ou tout autre nom de zone.
    Mais... À la balise fermante t'as juste besoin de remonter d'un niveau, c'est tout. Tu t'en fous du nom de quoi que ce soit ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre régulier
    Profil pro
    Retraité
    Inscrit en
    Mars 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2010
    Messages : 35
    Points : 117
    Points
    117
    Par défaut
    Oui, mais si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    currentNode = new DefaultMutableTreeNode(value);
    dans la méthode attachAttributeList au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    node.add(new DefaultMutableTreeNode(value));
    , je me retrouve avec tous mes noeuds attachés directement les uns aux autres (non respect de la hiérarchie xml).

  8. #8
    Membre régulier
    Profil pro
    Retraité
    Inscrit en
    Mars 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2010
    Messages : 35
    Points : 117
    Points
    117
    Par défaut
    Problème résolu!
    Voici le code de mon SAXTreeBuilder
    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
     
    import javax.swing.tree.DefaultMutableTreeNode;
     
    import org.xml.sax.Attributes;
    import org.xml.sax.helpers.DefaultHandler;
     
    public class SAXTreeBuilder extends DefaultHandler {
     
    	private DefaultMutableTreeNode currentNode = null;
    	private DefaultMutableTreeNode previousNode = null;
    	private DefaultMutableTreeNode rootNode = null;
     
    	public SAXTreeBuilder(DefaultMutableTreeNode root) {
    		rootNode = root;
    	}
     
    	public void startDocument() {
    		currentNode = rootNode;
    	}
     
    	public void endDocument() {
    	}
     
    	public void startElement(String uri, String qName, String lName,
    			Attributes atts) {
    		previousNode = currentNode;
     
    		if (lName.equals("zone")) {
    			currentNode = new DefaultMutableTreeNode (atts.getValue("", "nom"));
    		} else {
    			currentNode = new DefaultMutableTreeNode ("monde");
    		}
    		// Add attributes as child nodes //
    		previousNode.add(currentNode);
    	}
     
    	public void endElement(String uri, String qName, String lName) {
    		currentNode = (DefaultMutableTreeNode) currentNode.getParent();	
    	}
     
    	/**
             * reconstruit l'arbre au format désiré et le renvoie
             * 
             * @return DefaultMutableTreeNode l'arbre xml au format désiré
             */
    	public DefaultMutableTreeNode getTree() {
    		DefaultMutableTreeNode retour = (DefaultMutableTreeNode) rootNode
    				.getChildAt(0);
    		return retour;
    	}
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [JTree][XML] Node étendant DefaultMutableTreeNode
    Par mavina dans le forum Composants
    Réponses: 1
    Dernier message: 22/04/2009, 04h37
  2. Balises HTML dans un fichier XML
    Par Bastet79 dans le forum XML/XSL et SOAP
    Réponses: 12
    Dernier message: 04/09/2002, 15h29
  3. delphi XML / HTML caractéres speciaux !
    Par adem dans le forum EDI
    Réponses: 2
    Dernier message: 29/08/2002, 17h48
  4. Débutant XML
    Par viny dans le forum XML/XSL et SOAP
    Réponses: 8
    Dernier message: 25/07/2002, 12h07
  5. Pas de casse dans les XML
    Par :GREG: dans le forum Composants VCL
    Réponses: 4
    Dernier message: 17/07/2002, 13h51

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