Frank: XML in JTree

Hallo zusammen,

ich versuche eine XML-Struktur in einem JTree mit einer rekursiven Funktion abzubilden.

Hier das XML:

<?xml version="1.0" encoding="ISO-8859-1"?>
<menu>
 <menuitem>
  <name>1</name>
  <label>Startseite</label>
  <action></action>
  <target>_self</target>
  <link>index.html</link>
  <menu>
   <menuitem>
    <name>1.2</name>
    <label>Seite 1.2</label>
    <action></action>
    <target>_self</target>
    <link>index2.html</link>
   </menuitem>
  </menu>
 </menuitem>
 <menuitem>
  <name>2</name>
  <label>Seite 2</label>
  <action></action>
  <target>_self</target>
  <link>index3.html</link>
 </menuitem>
</menu>

Hier mein Code:

import java.util.Iterator;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import org.jdom.Document;
import org.jdom.Element;

public class TreeTest {

public static void xmlToJTree(Element menuroot, DefaultMutableTreeNode parentNode) {

Iterator allitems;
  Element currentMenuitem = null;
  allitems = menuroot.getChildren("menuitem").iterator();

while (allitems.hasNext()) {
   currentMenuitem = (Element) allitems.next();
   parentNode.add(new DefaultMutableTreeNode(currentMenuitem.getChild("label").getText()));
   if (currentMenuitem.getChildren("menu").size() > 0) {
    xmlToJTree(currentMenuitem.getChild("menu"), parentNode);
   }
  }
 }

public static void main(String[] args) {

DefaultMutableTreeNode initNode = new DefaultMutableTreeNode("Root");
  String pathtomenuxml = ApplicationPathProperties.getXMLPagePath() + "/1/menu/1.xml";
  Document xmlbasicdoc = XMLFunctions.getXMLDocument(pathtomenuxml);
  Element initLevel = xmlbasicdoc.getRootElement();

if (xmlbasicdoc.hasRootElement()) {
   xmlToJTree(initLevel, initNode);
  }

JTree testtree = new JTree(initNode);
  JFrame frame = new JFrame();
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.getContentPane().add(new JScrollPane(testtree));
  frame.pack();
  frame.setVisible(true);

}

}

Die Rekursion wird auch sauber durchlaufen, allerdings hängen im JTree alle Elemente auf der ersten Ebene... Mhmmm....

Was läuft da schief?

Vielen Dank schon mal und noch einen schönen Sonntagabend!
Frank

  1. Hallo,

    Die Rekursion wird auch sauber durchlaufen, allerdings hängen im JTree alle Elemente auf der ersten Ebene... Mhmmm....

    Ich habe mir den Code jetzt nicht wirklich angeschaut. Im Grunde kannst du
    aber vermutlich den Fehler auch durch Debugging alleine finden. Laufe Schritt
    für Schritt den Code durch und schaue zu welchem Zeitpunkt welche Werte in den
    Variablen enthalten sind und welche Methoden mit welchen Parametern aufgerufen
    werden. Damit dürftest du in wenigen Minuten herausfinden können, was bei der
    Programmausführung schief läuft. So komplex ist der Code und die XML-Struktur
    ja nun nicht.

    Gruß
    Slyh

  2. Hej,

    falls Dein Debugging bisher erfolglos gewesen sein sollte:

      
    
    >  public static void xmlToJTree(Element menuroot, DefaultMutableTreeNode parentNode) {  
    >   
    >   Iterator allitems;  
    >   Element currentMenuitem = null;  
    >   allitems = menuroot.getChildren("menuitem").iterator();  
    >   
    >   while (allitems.hasNext()) {  
    >    currentMenuitem = (Element) allitems.next();  
    >    parentNode.add(new DefaultMutableTreeNode(currentMenuitem.getChild("label").getText())); // **  
    >    if (currentMenuitem.getChildren("menu").size() > 0) {  
    >     xmlToJTree(currentMenuitem.getChild("menu"), parentNode);  
    
    //                                                  ^--------------*  
    
    >    }  
    >   }  
    >  }  
    
    

    *) Dein Rekursiver Aufruf bezieht sich offensichtlich immer auf das gleiche parentNode-Objekt. Dabei möchtest du doch mit Sicherheit die Kinder des XML-Knotens dem korrespondierendem TreeNode hinzufügen, den du zwei Zeilen weiter oben (**) erzeugst.

    Beste Grüße
    Biesterfeld

    --
    Art.1: Et es wie et es
    Art.2: Et kütt wie et kütt
    Art.3: Et hätt noch immer jot jejange
    Das Kölsche Grundgesetz
    1. Hi Biesterfeld,

      jaja, der Wald und die Bäume... ;-)

      Danke für den Hinweis, jetzt klappts!

      Grüße - Frank