# XML Baum in JTree Abbilden



## Thomas Darimont (16. September 2004)

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):


```
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:

```
<?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


----------



## nove (12. Dezember 2006)

in der Miniaturansicht... woher kommen die #Text im Baum?


----------



## Romsl (13. Dezember 2006)

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


----------



## dan-ger (10. März 2007)

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


----------



## Thomas Darimont (10. März 2007)

Hallo,

schau mal hier:
http://www.tutorials.de/forum/java/...nd-die-attributwerte-als-baum-darstellen.html

Gruß Tom


----------



## dan-ger (11. März 2007)

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ß


----------



## daily75 (13. August 2007)

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


----------



## PollerJava (9. Januar 2008)

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


----------

