JTree rekursiv aus XML-Datei erzeugen

Happyman

Grünschnabel
Hi Leute!
Sitze grad an einem Problem fest und hab zu wenig Programmiererfahrung, um da weiterzukommen (glaube ich) - oder ich komm einfach nicht drauf.
Also, Aufgabe ist es, eine XML-Datei einzulesen und deren Struktur in eine Baumstruktur zu überführen. Und das OHNE vorgefertigte Parser wie den DOM-Parser etc. (seufz)
Ich will das mit DefaultMutableTreeNodes lösen und dann in nem JTree ausgeben lassen.
Die kleine, feine Test-XML-Datei, die eingelesen werden soll, sieht so aus:

Code:
<buecherei>
	<buch>
		<autor>Dominik57</autor>
		<titel>Versautes aus meinem Leben</titel>
		<seiten>285</seiten>
		<isbn>2375492928</isbn>
	</buch>
</buecherei>

Und hier meine kleine Parser-Klasse - bestimmt nichts hochprofessionelles und absolut effizientes, aber es soll ja auch nur funktionieren ;)

Code:
package xmlParser;


import java.io.*;
import java.util.regex.*;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import java.awt.Dimension;

import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeSelectionModel;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;

public class XMLparse {
	
	static String datei = new JFileCHooserDemo().auswahlfenster();
	static String dokument ="";
	static String linie;
	//Create the nodes.
    static DefaultMutableTreeNode wurzel;
    static DefaultMutableTreeNode knoten;
    static DefaultMutableTreeNode blatt;
    static int zaehler = 0;

	
	public static void main(String argv[])
	  {
	    if (datei == null) {
	      System.err.println(
	          "Keine Datei gewählt!");
	      System.exit(1);
	    }
	    else {
	    	parse();
	    	ausgabe();
	    }
	  }
	public static void parse() {
		
		try {
			FileReader dateileser = new FileReader(datei);
			BufferedReader bufferleser = new BufferedReader(dateileser);
			while((linie = bufferleser.readLine()) != null)
			{
				dokument += linie;
			}
			// dokument = dokument.replaceAll(" ", "");
			dokument = dokument.replaceAll("	", "");	
			
			// System.out.println(dokument);
			dateileser.close();
			bufferleser.close();
			
			

			zerteilen(dokument);

		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
	
	
	public static void zerteilen(String str)
	{
		String zwischenspeicher = str;
		Pattern p = Pattern.compile("(<)(\\w*)(>)(.*)</\\2>");
		Matcher m = p.matcher(zwischenspeicher);
		


		while (m.find())
		{
			
			zaehler += 1;
			if (zaehler == 1)
			{
				wurzel = new DefaultMutableTreeNode(m.group(2));
			}
			else 
			{
				knoten = new DefaultMutableTreeNode(m.group(2));
				wurzel.add(knoten);
			}
				
			Matcher pruefmatcher = p.matcher(m.group(4));
			if (pruefmatcher.find() == false)
			{
				blatt = new DefaultMutableTreeNode(m.group(4));
				knoten.add(blatt);
			}

			zwischenspeicher = m.group(4);
			zerteilen(zwischenspeicher);
			
			
		}
		
	}

	public static void ausgabe(){
        JTree tree = new JTree( wurzel );
        
        JFrame frame = new JFrame( "XML-Baum" );
        frame.add( new JScrollPane( tree ));
        frame.setMinimumSize(new Dimension(200,400));
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        //frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible( true );

	}


}

Mein Denkknoten liegt in der rekursiven Methode zerteilen(). Denn zur Zeit sieht die Ausgabe des Baumes so aus:

http://img200.imageshack.us/img200/9867/xml.png

Da müssen aber eigentlich "Autor", "Titel", "Seiten" und "ISBN" Kinder von "Buch" sein

Wie schaff ich dass, dass der mir den Baum wie gewünscht "mehr verschachtelt"
Vielen Dank im Voraus für eure Antworten :-*

Happyman
 
XML so selber parsen ist aber sehr kompliziert. Eine einfache API wie XStream machts einfacher. In deinem Fall würde wahrscheinlich ein Stax-Parser auch recht gut funktionieren.

Wenn ein neues Element anfängt erstellt du dir ein TreeNode und merkst dir diesen in einer Variablen. Jedes Unterelement fügst du dann dem aktuellen hinzu und machst es selber zum aktuellen. Sobald ein Element endet rufst du auf dem aktuellen Knoten getParent auf und packst diesen in die Variable.

So solltest du nen Tree erhalten.
 
Zurück