# JTree - Nur Elemente mit Attributen einfügen



## SebastianK (23. Dez 2007)

Hallo,

ich versuche mich im Moment mit Java und XML, komme nur nicht weiter.

Ich möchte eine XML-Datei einlesen und in einem JTree darstellen. Ich habe nur das Problem, dass Einträge erscheinen die keinen Namen besitzen und ich nicht weiß wo mein Fehler liegt.


Die XML-Datei die ich einlese:

```
<?xml version="1.0" ?>
<root>
	<person name="Meier" alter="30" />
	
	<person name="Schulze" alter ="20">
		<vorname>Harald</vorname>
		<vater name="Schulze2" alter="50"/>
	</person>
</root>
```


Der JTree sieht dann so aus:







Der Code:

```
private void read(File file, DefaultMutableTreeNode root) {
	try {
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		DocumentBuilder db = dbf.newDocumentBuilder();
		doc = db.parse(file);

 		buildTree(doc, root);
 	} catch (Exception e) { JOptionPane.showMessageDialog(this,e); }
}//read

private void buildTree(Node node,DefaultMutableTreeNode parentTreeNode) {
	DefaultMutableTreeNode treeNode = new DefaultMutableTreeNode();

	switch (node.getNodeType()) {
	case Node.COMMENT_NODE: 
		treeNode.setUserObject(node.getTextContent());
		break;
 			
	case Node.ELEMENT_NODE: 
		String s = getAttr(node);		
		treeNode.setUserObject(s);
		break;
 			
	case Node.TEXT_NODE: 
		String textContent = node.getTextContent().trim();
		if (textContent.equals("")) {
			return;
		}
		treeNode.setUserObject(textContent);
		break;	
 	}//switch
 
 	parentTreeNode.add(treeNode);
 		
 	if (node.hasChildNodes()) {
 		NodeList list = node.getChildNodes();
 		for (int i = 0, len = list.getLength(); i < len; i++) {
 			buildTree(list.item(i), treeNode);
 		}
 	}
}//buildTree

public String getAttr(Node node) {
	StringBuilder s = new StringBuilder();
	NamedNodeMap atts = node.getAttributes(); //Menge der Attribute
	int n = atts.getLength();
	if(n > 0) {
		for(int i=0; i<n; i++) {
			Attr nodeAttr = (Attr) atts.item(i);

			if (nodeAttr.getNodeName().equals("name"))
				s.append(nodeAttr.getNodeValue());
		}

	}
	if (n < 1) {
		return null;
	}
	return s.toString();
}//getAttr
```


Angezeigt soll im JTree lediglich das Attribut 'name' eines Elementes aus der XML-Datei.
Dabei stören mich jetzt die ersten beiden Knoten ohne Namen und der leere Knoten unter "Schulze".

Als Lösung hatte ich mir vorgestellt nur Elemente aus der XML-Datei eizufügen, die ein Attribut "name" besitzen (dabei würde ja der Knoten "Harald" rausfallen, was aber nicht weiter störend wäre). Bekomme ich allerdings nicht hin.
Würd mich freuen, wenn mir jemand weiterhelfen könnte.

Nehme natürliche auch andere Lösungen an, um die leeren Knoten nicht anzuzeigen.


----------



## Beni (23. Dez 2007)

Nur eine Idee: wenn ein TreeNode leer ist, dann wird er garnicht erst eingefügt.

```
DefaultMutableTreeNode parent = ...
Node node = ...

DefaultMutableTreeNode treeNode;
if( [node ist leer] ){
  treeNode = parent;
}
else{
  treeNode = new DefaultMutableTreeNode( [name] );
  parent.add( treeNode );
}

 if (node.hasChildNodes()) {
      NodeList list = node.getChildNodes();
      for (int i = 0, len = list.getLength(); i < len; i++) {
         buildTree(list.item(i), treeNode);
      }
   }
```


----------



## SebastianK (23. Dez 2007)

astrein! klappt genauso wie ichs haben wollte. ich dank dir!


----------

