XML Baum in JTree Abbilden

Thomas Darimont

Erfahrenes Mitglied
Hallo!

Hier mal ein kleines Beispiel, wie ihr eine XML Datei auslesen und als Baumstruktur darstellen könnt. (Die Datei test.xml muss im selben Verzeichnis wie die Klasse liegen):

Code:
import java.awt.BorderLayout;
import java.io.IOException;
import java.util.Arrays;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class JXMLTreeTest extends JFrame {

	private JTree tree;
	private JScrollPane scrollPane;

	public JXMLTreeTest() {
		super("JXMLTreeTest");
		setDefaultCloseOperation(EXIT_ON_CLOSE);

		DefaultMutableTreeNode root = initTreeRoot("test.xml");
		tree = new JTree(root);
		scrollPane = new JScrollPane(tree);
		getContentPane().add(scrollPane, BorderLayout.CENTER);

		pack();
		setVisible(true);
	}

	private DefaultMutableTreeNode initTreeRoot(String file) {
		Document doc = null;
		try {
			DocumentBuilderFactory factory =
				DocumentBuilderFactory.newInstance();
			DocumentBuilder builder = factory.newDocumentBuilder();
			doc = builder.parse(this.getClass().getResourceAsStream(file));
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		if (doc == null)
			return new DefaultMutableTreeNode("EMPTY");

		Node rootNode = doc.getFirstChild();
		DefaultMutableTreeNode root =
			new DefaultMutableTreeNode(rootNode.getNodeName());
		treeWalk(rootNode, 0, root);

		return root;
	}

	public static void treeWalk(
		Node node,
		int level,
		DefaultMutableTreeNode parentNode) {

		String nodeName = node.getNodeName();
		DefaultMutableTreeNode childNode = null;

		if (node.hasChildNodes()) {
			level++;
			System.out.println(repeat(level, ' ').append(nodeName));
			NodeList list = node.getChildNodes();
			int len = list.getLength();
			for (int i = 0; i < len; i++) {
				Node child = list.item(i);
				childNode = new DefaultMutableTreeNode(child.getNodeName());
				parentNode.add(childNode);
				treeWalk(list.item(i), level, childNode);
			}
		} else {
			childNode = new DefaultMutableTreeNode(node.getNodeValue());
			System.out.println(
				repeat(level, ' ').append(node.getTextContent()));
			parentNode.add(childNode);
		}
	}

	public static void main(String[] args) {
		new JXMLTreeTest();
	}

	public final static StringBuffer repeat(int n, char c) {
		char[] cA = new char[n];
		Arrays.fill(cA, c);
		return (StringBuffer) new StringBuffer().insert(0, cA);
	}
}

test.xml:
Code:
<?xml version="1.0"?>
<root><!--comment abc def ghi--><a><b>ABC0</b></a><a><b>ABC1</b></a><a><b>ABC2</b></a><a><b>ABC3</b><c>ABBDG</c></a></root>

HTH Gruß Tom
 

Anhänge

  • tree.jpg
    tree.jpg
    14,9 KB · Aufrufe: 2.238
Der Inhalt innerhalb des Wurzelelements kann aus verschiedenen Nodes bestehen. Es koennen weitere Elemente, PI oder eben Texte sein. Der XML Baum baut dafuer einen Knoten des Typs Text auf und speichert darin als Kind den Text extra... (Deshalb der #text Knoten und dann nochmal extra ein Knoten fuer den eigentlichen Text)

Hmm... selbst ein wenig verwirrend mein Text... wird aber einfacher wenn man sich das DOM anschaut.

Gruss,
-- Romsl
 
Und wie lösche ich solche "#text Knoten"!?

Bzw. lass ich mir meine XML Datei in einem JTree ausgeben, hab nur leider neben meinen richtigen Knoten auch Knoten die "#text" heißen. Diese Knoten möchte ich aber nicht!!

Bitte helft mir!!


Gruß Daniel
 
Hallo,

ich probiere seid letzter Nacht folgendes:

Ich habe mir aus meiner XML Datei -->

(Auszug ...)
<?xml version="1.0"?>
<Geometrie>
<Wuerfel>
<Wuerfel_1 Description="Groesse: 5x5cm - Farbe: Rot"></Wuerfel_1>
<Wuerfel_2 Description="Groesse: 7x7cm - Farbe: Blau"></Wuerfel_2>
</Wuerfel>
</Geometrie>


einen JTree anzeigen lassen. So weit so gut. Ich lasse mir den Baum auch nur bis Wuerfel_01. bzw Wuerfel_02 ausgeben. Die Ausgabe des Baumes sieht also wie folgt aus:

Geometrie (Ordner)
+ Wuerfel (Ordner)
- Wuerfel_01 (Blatt)
- Wuerfel_02 (Blatt)

Was ich jetzt gern haben möchte, ist das wenn der User in dem Baum auf Wuerfel_01 klickt, also auf das Blatt, mir die Description dieses Tags (also das Attribut) auf einem JLabel oder der gleichen ausgegeben wird.
Kan mir jemand in diesem Fall weiter helfen!? Ich bekomme das einfach hin.

Die Theorie verstehe ich soweit, nur ich bekomm es nicht umgesetzt *argh*.


Gruß
 
Zuletzt bearbeitet:
Hallo,

Ich habe hierzu auch eine Frage und zwar wenn ich jetzt im #comment teil der XML-Datei ein Element auskommentiert hätte.
Also sowas " <!-- <element> test </element> --> "kann ich dann dieses Element trozdem als Element und nicht als comment im Baum anzeigen lassen?
Wenn ja wie geht das ?

Gruß
daily
 
Hallo,

Ich habe mir das Programm http://www.tutorials.de/forum/java/2...arstellen.html von oben angesehen und es funktioniert super,
Meine Frage wäre, ob das auch in die andere Richtung funktioniert, also eine XML- Datei einlesen und in einem JTree darstellen, dann verändern und danach diesen JTree wieder in eine andere XML- Datei rausspeichern.

Ist das irgendwie leicht möglich oder muss man sich das selber ausprogrammieren?

Vielen Dank für die Antworten,

lg
 
Zuletzt bearbeitet:
Zurück