Swing XML Datei in JTree, Problem mit Daten einlesen

raffi

Mitglied
Hallo,
Ich habe da ein Problem mit dem Einlesen einer XML in einen JTree. Meine XML Datei ist so aufgebaut, das ich sozusagen 2 mal absteigen muss bis etwas "passiert". Und genau da liegt der Punkt wo ich nicht weiterkomme.
Ersteinmal der Quelltextschnipsel:
Java:
private DefaultMutableTreeNode createNode (Element profNode) {
		DefaultMutableTreeNode childNode;
		DefaultMutableTreeNode tucNode;
		
		
		tucNode = new DefaultMutableTreeNode();
		Node n = profNode.getFirstChild();
		for (n = n.getFirstChild(); n != null; n.getNextSibling()) {
			if (n.getNodeType() != Node.ELEMENT_NODE) {
				continue;
			}
			Element el = (Element) n;
			tucNode.add(createProfessurNode(el));
		}
		return tucNode;
	}
Und hier die XML:
[XML]
<?xml version="1.0" encoding="UTF-8"?>
<tuc>
<professur>
<profname>Wirtschaftsinformatik 1</profname>
<mail>aaa@aaa.de</mail>
<forschung>Geschäftsprozesse</forschung>
<veranstaltungen>
<veranstaltung>
<name>WI-Praktikum</name>
<verantwortlicher>xxx</verantwortlicher>
<raum>2/316</raum>
<typ>Praktikum</typ>
</veranstaltung>
<veranstaltung>
<name>Geschäftsprozessmodellierung und Management</name>
<verantwortlicher>xxx</verantwortlicher>
<raum>2/N112</raum>
<typ>Vorlesung</typ>
</veranstaltung>
<veranstaltung>
<name>E-Business</name>
<verantwortlicher>xxx</verantwortlicher>
<raum>2/D1</raum>
<typ>Vorlesung</typ>
</veranstaltung>
</veranstaltungen>
</professur>
<professur>
<profname>Wirtschaftsinformatik 2</profname>
<mail>bbb@bbb.de</mail>
<forschung>Systementwicklung und BI</forschung>
<veranstaltungen>
<veranstaltung>
<name>IIS</name>
<verantwortlicher>xxx</verantwortlicher>
<raum>2/N102</raum>
<typ>Vorlesung</typ>
</veranstaltung>
<veranstaltung>
<name>AIS</name>
<verantwortlicher>xxx</verantwortlicher>
<raum>2/NK003</raum>
<typ>Uebung</typ>
</veranstaltung>
<veranstaltung>
<name>Gestaltung von Anwendungssystemen</name>
<verantwortlicher>xxx</verantwortlicher>
<raum>2/N105</raum>
<typ>Vorlesung</typ>
</veranstaltung>
</veranstaltungen>
</professur>
<professur>
<profname>Betriebssysteme</profname>
<mail>ccc@ccc.de</mail>
<forschung>Betriebssyteme</forschung>
<veranstaltungen>
<veranstaltung>
<name>Grundlagen der Anwendungsunterstützung</name>
<verantwortlicher>xxx</verantwortlicher>
<raum>1/346</raum>
<typ>Vorlesung</typ>
</veranstaltung>
</veranstaltungen>
</professur>
</tuc>
[/XML]

Ich steige oben nur einmal ab, weshalb ich sozusagen nur auf dem Knoten <tuc> rumspringe und eine Endlosschleife verursache. Wenn ich jetzt allerdings nochmal eine Schleife einfüge um noch eine Stufe weiter abzusteigen, dann landet er ebenfalls in einer Endlosschleife und springt ziwschen den beiden for-Schleifen hin und her.
Was mache ich denn falsch?

MfG
 

chriis

Aktives Mitglied
Node org.w3c.dom.Node.getNextSibling();

Die Methode getNextSibling hat einen Rückgabewert, den musst du deiner Schleifenvariable zuweisen. So durchläufst immer das erste Kindchen..

Java:
 for (Node n = n.getFirstChild(); n != null; n = n.getNextSibling())[...]

oder
Java:
Node node = profNode.getFirstChild();
while(node != null){
  if (n.getNodeType() != Node.ELEMENT_NODE)
    continue;
  tucNode.add(createProfessurNode(Element.class.cast(n)));
  node = node.getNextSibling();
}
 
Zuletzt bearbeitet:

raffi

Mitglied
Hallo und danke, das hat mir schonmal weitergeholfen.
Jetzt funktioniert das ganze fast so wie ich das will, habe aber trotzdem schon wieder das nächste Problem. Wie zu sehen muss ich einem Knoten des JTree entweder ein Professur- oder Veranstaltungsobjekt einbinden. Dazu muss ich für ein Objekt jeweils erstmal die ganzen Textknoten durchlaufen um ein einzelnes Objekt zu erstellen und so komplet einzufügen. Derzeit laufe ich einmal durch meine Methode und erstelle dann mein Objekt. Resultat ist, dass ich bspw. 3 Objekte habe, das erste hat nur den Namen der Professur, das zweite nur die Mailadresse und das dritte nur die Forschung.

Java:
private DefaultMutableTreeNode createProfessurNode (Element el) {
		String profName = null;
		String mail = null;
		String forschung = null;
		DefaultMutableTreeNode childNode = new DefaultMutableTreeNode();
		
		if (el.getNodeName().equals("profname")) {
			profName = el.getFirstChild().getNodeValue();
		}
		else if (el.getNodeName().equals("mail")) {
			mail = el.getFirstChild().getNodeValue();
		}
		else if (el.getNodeName().equals("forschung")) {
			forschung = el.getFirstChild().getNodeValue();
		}
		else if (el.getNodeName().equals("veranstaltungen")) { //Veranstaltungsobjekt einlesen
			for (Node topn = el.getFirstChild(); topn != null; topn = topn.getNextSibling()) {
				for (Node secondn = topn.getFirstChild(); secondn != null; secondn = secondn.getNextSibling()) {
					if (secondn.getNodeType() != Node.ELEMENT_NODE) {
						continue;
					}
					Element childEl = (Element) secondn;
					childNode.add(createVeranstNode(childEl));
					return childNode;
				}
			}	
		}
		Node dummy = el;
		if ((dummy = dummy.getNextSibling()) != null) { //alle Nachbarn (Textknoten) durchlaufen, funktioniert aber nicht
			createProfessurNode(el = (Element)dummy.getNextSibling());
		}
		System.out.println(profName+" "+mail+" "+forschung); //Testausgabe
		return new DefaultMutableTreeNode(new Professur(profName, mail, forschung));
	}

Wieso funktioniert das mit diesem rekursivem Aufruf nicht (Ergebnis ist das gleiche wie oben beschrieben)?

MfG
 

chriis

Aktives Mitglied
In Zeile 30 rufst du ja createProfessurNode, benutzt aber wieder nicht den Rückgabewert ;)
Außerdem hast du in der Schleifen-Verschachtelung in Zeile 24 ein return, wenn ich das richtig lese, wird also nur das erste Kindeskind durchlaufen und dann die Bearbeitung abgebrochen.

Wie genau soll das nachher eigentlich aussehen?
 

raffi

Mitglied
In Zeile 30 rufst du ja createProfessurNode, benutzt aber wieder nicht den Rückgabewert ;)
Ich sag mal ganz frech, das ich das mit Absicht nicht mache. Ich will ja erst etwas zurückgeben, sobald ich wirlich alle Textknoten durchlaufen habe. Also soll es erst eine Rückgabe geben sobald das Professurobjekt eine namen, eine mail und eine forschung hat (also alles != null). Aber kann auch sein ich geh da falsch ran!?

Außerdem hast du in der Schleifen-Verschachtelung in Zeile 24 ein return, wenn ich das richtig lese, wird also nur das erste Kindeskind durchlaufen und dann die Bearbeitung abgebrochen.
Das hat etwas damit zu tun, das ich ja an dieser Stelle in die nächste Methode gehe, wo das zu der Professur gehörige Veranstaltungsobjekt erstellt wird. Dass das so auch nicht ganz richtig ist weis ich, aber da bin ich noch am überlegen wie das korrekt funktioniert. Aber auch hier besteht das oben beschriebene Problem.
Zugehörige Methode:
Java:
private DefaultMutableTreeNode createVeranstNode (Element el) {
		String veranstName = null;
		String raum = null;
		String verantwortlicher = null;
		String typ = null;
		
		if (el.getNodeName().equals("name")) {
			veranstName = el.getFirstChild().getNodeValue();
		}
		else if (el.getNodeName().equals("verantwortlicher")) {
			verantwortlicher = el.getFirstChild().getNodeValue();
		}
		else if (el.getNodeName().equals("raum")) {
			raum = el.getFirstChild().getNodeValue();
		}
		else if (el.getNodeName().equals("typ")) {
			typ = el.getFirstChild().getNodeValue();
		}
		System.out.println(veranstName+" "+verantwortlicher+" "+raum+" "+typ);
		return new DefaultMutableTreeNode(new Lehrveranstaltung(veranstName, verantwortlicher, raum, typ));
	}

Wie genau soll das nachher eigentlich aussehen?
Das Endergebnis soll links den JTree haben, also die Professuren und darunter jeweils die zugörigen Veranstaltungen. Wobei jeweils nur der Name angezeigt wird. Bei Klick auf einen Knoten soll dann rechts daneben in einer Tabelle die Eigenschaften angezeigt werden.
Aber soweit bin ich ja noch lange nicht :)
Es zeigt mir derzeit aber schonmal korrekt die namen der drei Professuren an (auf der gleichen Ebene dann 3 Zeilen Platz wegen der drei Eigenschaften), und auch jeweils die erste Veranstaltung und nur die als Kindelement. Das ist jedoch garantiert diesem ominösen return von oben zu verdanken.

MfG
 
Zuletzt bearbeitet:

chriis

Aktives Mitglied
Also diese Methode createVeranstNode gibt ja immer nur eine Veranstaltung zurück die nur einen Namen, Verantwl., Raum oder Typ hat, wenn du eine Komplette Veranstaltung erstellen willst musst du doch alle Kinder der Veranstaltung durchlaufen um die Werte alle zu sammeln.


Ich denk mal so könnte das dann aussehen..
Java:
private DefaultMutableTreeNode createVeranstNode (Element el) throws Exception {
  String veranstName = null;
  String raum = null;
  String verantwortlicher = null;
  String typ = null;
  Node currentChild = null;
        
  if(!el.getNodeName().equals("Veranstaltung"))
    throw new Exception("Kein Veranstaltungs-Knoten übergeben");
  
  currentChild = el.getFirstChild;
  while(currentChild != null){
    if (currentChild.getNodeName().equals("name"))
      veranstName = currentChild.getNodeValue();
    else if (currentChild.getNodeName().equals("verantwortlicher"))
      verantwortlicher = currentChild.getNodeValue();
    else if (currentChild.getNodeName().equals("raum"))
      raum = currentChild.getNodeValue();
    else if (currentChild.getNodeName().equals("typ"))
      typ = currentChild.getNodeValue();
    currentChild = currentChild.getNextSibling();
  }
  if(veranstName == null | verantwortlicher == null | raum == null | typ == null)
    throw new Exception("Nicht alle erforderlichen Werte vorhanden");
  return new DefaultMutableTreeNode(new Lehrveranstaltung(veranstName, verantwortlicher, raum, typ));
}
 
Zuletzt bearbeitet:

raffi

Mitglied
Das sieht natürlich besser aus und ist auch logischer als der rekursive Aufruf. Hätt ich auch selbst drauf kommen können :oops:
Danke, so kann ich schon weiter arbeiten :toll:

MfG und ein schönes Wochenende
 

raffi

Mitglied
Hallo, ich mal wieder.
Also ich hänge jetzt doch an der while-Schleife. Und zwar gibt Node.getNodeName() ja bei Textknoten nur #text zurück. Somit liest man auch nix ein, in meinem Fall. Ich hatte mir deshalb überlegt el durch umcasten aus currentChild zu erhalten. Aber auch das funktioniert nicht, da es sich hier um Textknoten handelt.

MfG
 

chriis

Aktives Mitglied
Was willst du casten, ein Element in ein Node? Element ist ja von Node abgeleitet..sollte also klappen. Was willst du erreichen?
 

raffi

Mitglied
Hallo, mein Quelltext sieht jetzt so aus:

Java:
private DefaultMutableTreeNode createProfessurNode (Element el) {
		String profName = null;
		String mail = null;
		String forschung = null;
		DefaultMutableTreeNode childNode = new DefaultMutableTreeNode();
		Node dummyNode = null;
		
		dummyNode = el.getFirstChild();
		while (dummyNode != null) {
			if (el.getNodeName().equals("profname")) {
				profName = dummyNode.getNodeValue();
			}
			else if (el.getNodeName().equals("mail")) {
				mail = dummyNode.getNodeValue();
			}
			else if (el.getNodeName().equals("forschung")) {
				forschung = dummyNode.getNodeValue();
			}
			/*else if (el.getNodeName().equals("veranstaltungen")) { //Veranstaltungsobjekt einlesen
				for (Node topn = el.getFirstChild(); topn != null; topn = topn.getNextSibling()) {
					for (Node secondn = topn.getFirstChild(); secondn != null; secondn = secondn.getNextSibling()) {
						if (secondn.getNodeType() != Node.ELEMENT_NODE) {
							continue;
						}
						Element childEl = (Element) secondn;
						childNode.add(createVeranstNode(childEl));
					}
				}	
			}*/
			dummyNode = dummyNode.getNextSibling();
            el = (Element) dummyNode; //Das war so mein Gedanke, geht aber nicht da Textknoten und kein Elementknoten 
		}
		
		System.out.println(profName+" "+mail+" "+forschung); //Testausgabe
		return new DefaultMutableTreeNode(new Professur(profName, mail, forschung));
	}

Wobei ich eben nicht mit dummyNode.getNodeName().equals(xxx) arbeiten kann, da dieses eben nur #text zurückliefert. Aber ich wechsle ja den el-Knoten nicht, sodass ich vom Ergebnis her immernoch dort bin, wo ich vorher war.

MfG
 
Zuletzt bearbeitet:

raffi

Mitglied
Mit Node.getNodeValue() erhalte ich direkt den Inhalt (z. B. den Name der Professur, die Mail Adresse usw.), das hatte ich auch schon probiert. Ist eigentlich ein ganz simples Problem, aber wie löst man das am dümmsten? Ich kann ja die Textknoten nicht in Element umcasten...

MfG
 

chriis

Aktives Mitglied
Hast du die anderen Methoden versucht? .getTagName() .getLocalName()?
Ich hab das bei mir mit .getName() gemacht und das funktioniert gut, ich benutz aber auch org.jdom.Element und nicht org.w3c.dom.Element.
 

raffi

Mitglied
OK, daran liegts dann wahrscheinlich auch. Ich nutze den die w3c importe. Habe mir jetzt allerdings mal die jdom Library eingefügt.
Da muss ich aber jetzt ganz schön was ändern...na schaun mer mal.
Ist dein Node vom import xml.soap oder auch w3c?

MfG
 

raffi

Mitglied
OK, bei JDOM gibts nur Element wenn ich das richtig sehe? Du hast aber oben in deinem Beispiel Node currentChild = null geschrieben. Da musst du doch irgendetwas importiert haben?
 

raffi

Mitglied
So, da isser wieder.:)

Also mit JDOM klappt es jetzt, zumindest erstmal für die Professuren. Steht nur noch das Problem mit den Veranstaltungen.

Java:
private DefaultMutableTreeNode createProfessurNode (Element el) {
		String profName = null;
		String mail = null;
		String forschung = null;
		DefaultMutableTreeNode childNode = new DefaultMutableTreeNode();
		
		List childList = el.getChildren();
		for (int i = 0; i < childList.size(); i++) {
			Element dummyEl = (Element)childList.get(i);
			if (dummyEl.getName().equals("profname")) {
				profName = dummyEl.getValue();
			}
			else if (dummyEl.getName().equals("mail")) {
				mail = dummyEl.getValue();
			}
			else if (dummyEl.getName().equals("forschung")) {
				forschung = dummyEl.getValue();
			}
			else if (dummyEl.getName().equals("veranstaltungen")) { //Veranstaltungsobjekt einlesen
				List vList = dummyEl.getChildren();
				for (int j = 0; j < vList.size(); j++) {
					Element childEl = (Element)vList.get(j);
					childNode.add(createVeranstNode(childEl));
					return childNode;
				}
			}
		}
		return new DefaultMutableTreeNode(new Professur(profName, mail, forschung));
	}

Könnte ich die erstellten Knoten in der createChildNode-Methode in irgendetwas soeichern, ähnlich einer Liste und diese dann hinzufügen zum Jtree oder wie sollte ich das besser angehen?

MfG
 

chriis

Aktives Mitglied
In den Konstruktor new DefaultTreeModel(); kannst du deinen DefaultMutableTreeNode rein werfen und das daraus erzeugte Model mit .setModel() deinem JTree übergeben.


Ich seh gerade, du kannst auch gleich nen TreeNode übergeben.. also so:
Java:
JTree tree = new JTree(createProfessurNode(tmp));
 
Zuletzt bearbeitet:

raffi

Mitglied
Vllt. sollte ich auch mal noch meine Methoden bis dahin posten. Im Grunde genommen mache ich da ganze mit setModel schon.

Java:
private void openFile () {
		JFileChooser jfc = new JFileChooser();
		if (jfc.showOpenDialog(frame) == jfc.APPROVE_OPTION) {
			File file = jfc.getSelectedFile();
			DefaultMutableTreeNode root = readFile(file);
			if (root != null) {
				model = new DefaultTreeModel(root);
				tree.setModel(model);
			}
		}
	}
	
	private DefaultMutableTreeNode readFile (File file) {
		DefaultMutableTreeNode root = null;
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		Document doc = null;
		try {
			SAXBuilder builder = new SAXBuilder();
		    doc = builder.build(file);
		}
		catch (Exception e) {
			e.getMessage();
			doc = null;
		}
		if (doc == null) {
			return null;
		}
		Element nRoot = doc.getRootElement();
		if (!nRoot.getName().equals("tuc")) {
			return null;
		}
		root = createNode(nRoot);
		return root;
	}
	
	private DefaultMutableTreeNode createNode (Element profNode) {
		DefaultMutableTreeNode childNode;
		DefaultMutableTreeNode tucNode;
		
		tucNode = new DefaultMutableTreeNode();
		firstList = profNode.getChildren();
		for (int i = 0; i < firstList.size(); i++) {
			Element firstEl = (Element)firstList.get(i);
			Element el = (Element) firstEl;
			tucNode.add(createProfessurNode(el));
		}	
		return tucNode;
	}

Dadurch das ich das ganze immer durchreiche finde ich da irgendwie keine richtige Lösung für.
 

chriis

Aktives Mitglied
Ich hab dein Problem nicht ganz mitbekommen..willst du an einen bestehenden Baum etwas anfügen oder willst du den als Datei speichern?
 

raffi

Mitglied
Problem ist derzeit das Einlesen in den JTree, das ich die Veranstaltungen als Kinder an die Professuren anfügen will. Beim Einlesen habe ich jedoch dabei Schwierigkeiten mit der Behandlung. Das Einlesen eines Professur- respektive Lehrveranstaltungesobjektes macht keine Probleme. Das problem entshet, sobald ich auf den Knoten veranstaltungen treffe. Dort rufe ich meine createVeranstNode-Methode auf. Mache aber dann ein return, weshalb ich natürlich nicht alles Professur-Kinder (also Lehrveranstaltungen) durchgehe.

Ich hoffe jetzt wird es wieder klarer ;D
 

chriis

Aktives Mitglied
Du hast ja an der Professur einmal das Veranstaltungsblatt und an dem die einzelnen Veranstaltungen.
Mit .getChildList(), glaub ich, kannst du dir die als Liste geben lassen und die mit einer Schleife durchlaufen. Für jeden Veranstaltungsknoten erstellst du dann den Baum dazu und fügst ihn dem Prof-Baum als Child hinzu..soweit die theorie..

bis dann
 
Zuletzt bearbeitet:

raffi

Mitglied
Morschen...
Also ich hab das verstanden, weis nur nicht wie ich nen extra Baum erstelle und diesen an den eigentlichen anfüge. Die Mtehode sieht derzeit so aus, wenn ich das richtig interpretiert habe.
Java:
private DefaultMutableTreeNode createVeranstNode (Element el) {
		String veranstName = null;
		String raum = null;
		String verantwortlicher = null;
		String typ = null;
		
		List firstChildList = el.getChildren();
		for (int i = 0; i < firstChildList.size(); i++) {
			Element dummyEl = (Element) firstChildList.get(i);
			List childList = dummyEl.getChildren();
			for (int j = 0; j < childList.size(); j++) {
				Element childEl = (Element) childList.get(j);
				if (childEl.getName().equals("name")) {
					veranstName = childEl.getValue();
				}
				else if (childEl.getName().equals("verantwortlicher")) {
					verantwortlicher = childEl.getValue();
				}
				else if (childEl.getName().equals("raum")) {
					raum = childEl.getValue();
				}
				else if (childEl.getName().equals("typ")) {
					typ = childEl.getValue();
				}
			}
			//hier muss der Baum aufgebaut werden oder?
		}
		
		//System.out.println(veranstName+" "+verantwortlicher+" "+raum+" "+typ);
		return new DefaultMutableTreeNode(new Lehrveranstaltung(veranstName, verantwortlicher, raum, typ)); //und hier müsste der Baum zurückgegeben werden!?
	}
 

chriis

Aktives Mitglied
Soo könnte das aussehen.. ich garantiere aber wieder nicht für lauffähigkeit.. hab die Libs grad nicht hier.

Java:
private DefaultMutableTreeNode createVeranstaltungNode (Element el) {
	DefaultMutableTreeNode
		root = null;
    String 
    	name = null,
    	raum = null,
    	verantw = null,
    	typ = null;
	List<Element> 
            chrildren = (List<Element>)el.getChildren();
    
	if(!el.getValue().equals("Veranstaltung"))
		throw new Exception("kein Veranstaltung-Element");
	name = el.getChildText("name");
	raum = el.getChildText("raum");
	verantw = el.getChildText("verantwortlicher");
	typ = el.getChildText("typ");
	root = new DefaultMutableTreeNode(name);
	root.add(new DefaultMutableTreeNode("Raum: " + raum));
	root.add(new DefaultMutableTreeNode("Verantwortlicher: " + verantw));
	root.add(new DefaultMutableTreeNode("Typ: " + typ));			
	return root;
}
    
private DefaultMutableTreeNode createProfesurNode (Element el) {
    DefaultMutableTreeNode
	    root = null;
    String 
    	name = null,
    	forschung = null,
    	mail = null;
    List<Element> 
        chrildren = (List<Element>)el.getChildren();
    
	if(!el.getValue().equals("professur"))
		throw new Exception("kein Professur-Element");
	name = el.getChildText("profname");
	mail = el.getChildText("mail");
	forschung = el.getChildText("forschung");
	root = new DefaultMutableTreeNode(name);
	root.add(new DefaultMutableTreeNode("E-Mail: " + mail));
	root.add(new DefaultMutableTreeNode("Forschung: " + forschung));
	for(Element e : (List<Element>)(el.getChild("Veranstaltungen").getChildren))
		root.add(createVeranstaltungNode(e));       //<<<<
	return root;
    }
 

raffi

Mitglied
Juhu, erster Meilenstein geschafft :D:D
Lösung sieht jetzt folgendermaßen aus (natürlich angelehnt an deinen Beispielcode chriis):

Java:
private DefaultMutableTreeNode createProfessurNode (Element el) {
		String profName = null;
		String mail = null;
		String forschung = null;
		DefaultMutableTreeNode parent = new DefaultMutableTreeNode();
		
		List childList = el.getChildren();
		for (int i = 0; i < childList.size(); i++) {
			Element dummyEl = (Element)childList.get(i);
			if (dummyEl.getName().equals("profname")) {
				profName = dummyEl.getValue();
			}
			else if (dummyEl.getName().equals("mail")) {
				mail = dummyEl.getValue();
			}
			else if (dummyEl.getName().equals("forschung")) {
				forschung = dummyEl.getValue();
			}
			else if (dummyEl.getName().equals("veranstaltungen")) { //Veranstaltungsobjekt einlesen
				parent = new DefaultMutableTreeNode(new Professur(profName, mail, forschung));
				createVeranstNode(dummyEl, parent);
			}
		}
		return parent;
	}
	
	private DefaultMutableTreeNode createVeranstNode (Element el, DefaultMutableTreeNode parent) {
		String veranstName = null;
		String raum = null;
		String verantwortlicher = null;
		String typ = null;
		
		List firstChildList = el.getChildren();
		for (int i = 0; i < firstChildList.size(); i++) {
			Element dummyEl = (Element) firstChildList.get(i);
			List childList = dummyEl.getChildren();
			for (int j = 0; j < childList.size(); j++) {
				Element childEl = (Element) childList.get(j);
				if (childEl.getName().equals("name")) {
					veranstName = childEl.getValue();
				}
				else if (childEl.getName().equals("verantwortlicher")) {
					verantwortlicher = childEl.getValue();
				}
				else if (childEl.getName().equals("raum")) {
					raum = childEl.getValue();
				}
				else if (childEl.getName().equals("typ")) {
					typ = childEl.getValue();
				}
			}
			parent.add(new DefaultMutableTreeNode(new Lehrveranstaltung(veranstName, verantwortlicher, raum, typ)));
		}
		return parent;
	}

Aber ich bin mir sicher es wird noch die eine oder andere Frage auftauchen...
Bis dahin schonmal danke.:toll:
 

raffi

Mitglied
So, und weiter geht die lustige Fragerunde :)

Also zwei Fragen sind inzwischen entstanden. Nummer 1 wäre, wie ich die Wurzel anklickbar machen kann, derzeit wirft er mir eine Exception aus wenn ich die Wurzel anklicke. Desweiteren ist die Wurzel nicht mehr beschriftet, sobald ich die Datei geladen habe.

Nummer 2 ist etwas allgemeiner gehalten. Und zwar geht es um das speichern des JTrees in eine XML-Datei. Muss bzw. kann ich mir den Aufbau aus dem DefaultTableModel holen oder woher bekomme ich den Aufbau?

MfG
 

chriis

Aktives Mitglied
1. Kannst nochmal Zeigen wie du die Wurzel erzeugst? Gibst du vielleicht kein value rein sondern nur nen Namen?

2. Hast du nicht eine DTD für deine XML Dateien? Darin wird die Struktur einer XML beschrieben, ists sowas das du suchst? Ich glaub damit kann man aber nur die XML prüfen und nicht nach dessen Vorbild erstellen.
 

raffi

Mitglied
Wurzel wird hier erzeugt:
Java:
private DefaultMutableTreeNode readFile (File file) {
		DefaultMutableTreeNode root = null;
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		Document doc = null;
		try {
			SAXBuilder builder = new SAXBuilder();
		    doc = builder.build(file);
		}
		catch (Exception e) {
			e.getMessage();
			doc = null;
		}
		if (doc == null) {
			return null;
		}
		Element nRoot = doc.getRootElement(); // Da müsste es sein
		if (!nRoot.getName().equals("tuc")) {
			return null;
		}
		root = createNode(nRoot);
		return root;
	}

DTD hab ich nicht extra gemacht, da ich dachte das man die nur zum Prüfen bzw. zum Vorgeben des Aufbaus benötigt.
Ich muss doch trotzdem irgendwie an das model dran kommen, da ich ja beim Speichern im Grunde genommen genau so vorgehen muss wie beim Laden, nur eben jetzt in die andere Richung. Beim Einlesen hat mir die XML-Datei als Quelle gedient, ist es jetzt das DefaultTableModel?
 

chriis

Aktives Mitglied
Ja genau, du erzeugst dann die xml aus dem Baum. Du musst dafür nur wissen wie deine Elemente angeordnet werden sollen, das ist ja ein bischen anders als im JTree.
 

raffi

Mitglied
Hm, also so wie ich mir das gedacht habe. Jetzt bin ich aber gerade auf das Problem gestoßen, das ich mir die Wurzel zwar holen kann mit model.getRoot(), das aber ein DefaultMutableTreeNode ist und ich den nicht in Element umcasten kann. Somit kann ich keine Listen erstellen für die Anzahl der durchläufe wegen der Kindknoten.

MfG
 
Zuletzt bearbeitet:

chriis

Aktives Mitglied
Dein Baum sieht ja so ähnlich aus wie unten.. mit .getRoot() bekommst ja den obersten Knoten. Unter diesem Knoten sollten ja deine Profs hängen, da kommst du also mit .getChildAt(int), oder so ähnlich, ran.
Ich würd vorschlagen, das rekursiv abzuarbeiten..also erstmal zu den Veranstaltungen durchhangeln, die für einen Prof alle erzeugen, dann die Veranstaltungen an den Prof hängen. Und danach mit dem nächsten weiter machen.

Java:
o : root
-o : prof1
  -o : veranst.1
  -o : veranst.2
  -o : veranst.3
  -o : veranst.4
-o : prof2
  -o : veranst.1
  -o : veranst.2
 

raffi

Mitglied
Moin moin,
genau so hab ich mir das gedacht mit den Aufbauen der XML-Datei. Nur wie gesagt weis ich nicht wie ich es anstellen soll einen DefaultMutableTreeNode bzw. ein Object in JDOM-Element zu casten...das geht eben nicht. Die Zeilen
DefaultMutableTreeNode testNode = (DefaultMutableTreeNode) model.getRoot();
Element profRoot = (Element)testNode.getChildAt(0);


geben eine Exception aus...also eigentlich nur die zweite Zeile.
 

chriis

Aktives Mitglied
ne, ne ,ne.. casten is da nich.. du musst das schon umschreiben. D.h. alle Werte auslesen und in die entsprechenden Tags verpacken und richtig verknüpfen.

Java:
DefaultTreeNode profTree;
Element tmpProf = new Element("professur");
Element tmpName = new Element("profname");
Element tmpMail = new Element("mail");
Element tmpForschung = new Element("forschung");

tmpName.addContent(profTree.getChild("profname").getValue());
tmpMail.addContent(profTree.getChild("mail").getValue());
tmpForschung.addContent(profTree.getChild("forschung").getValue());
tmpProf.addContent(tmpName);
tmpProf.addContent(tmpMail);
tmpProf.addContent(tmpForschung);
Sowas in der Art..
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
S JTree Datei Icons ? AWT, Swing, JavaFX & SWT 28
F Bilder zu ausführbarer Jar-Datei hinzufügen AWT, Swing, JavaFX & SWT 5
M Daten zufällig Einlesen aus einer Datei (binäres Format) AWT, Swing, JavaFX & SWT 7
ExceptionOfExpectation Mit einer laufenden GUI Applikation eine Datei in dem Rechner löschen AWT, Swing, JavaFX & SWT 2
melaniemueller Wortliste in einer Datei ablegen AWT, Swing, JavaFX & SWT 12
princess_sara1997 .jar Datei führt den Code nicht richtig aus AWT, Swing, JavaFX & SWT 19
Yonnig Lokale HTML-Datei in Java GUI rendern AWT, Swing, JavaFX & SWT 4
N JavaFX Javafx intelij Projekt zu ausführbaren jar Datei Machen AWT, Swing, JavaFX & SWT 1
Jose05 JavaFX: eigene FXML-Datei für einen Button AWT, Swing, JavaFX & SWT 3
T FXML Datei in Java Code einbinden: javafx.fxml.LoadException AWT, Swing, JavaFX & SWT 2
BabySuna Swing Komponenten auslagern auf separate Datei AWT, Swing, JavaFX & SWT 8
J Java Datei durch CMD mit Parameter ausführen AWT, Swing, JavaFX & SWT 1
B JavaFX JavaFX Anwendung deployen (entw als runnableJAR oder exe-Datei) AWT, Swing, JavaFX & SWT 15
M Eine Datei auf den Apache Server hochladen - über das Menü im JavaProgramm AWT, Swing, JavaFX & SWT 7
VPChief Gibt es eine möglichkeit Dateien aus der jar datei zu kopieren? AWT, Swing, JavaFX & SWT 46
H Daten aus einer XML(x83-Datei) in einem JFrame anzeigen lassen AWT, Swing, JavaFX & SWT 9
MasterCaution Swing .jar Datei ausführen AWT, Swing, JavaFX & SWT 12
A Swing Datei lässt sich zwar speichern, aber nicht laden (Inhalt im JTextField anzeigen) AWT, Swing, JavaFX & SWT 18
K Probleme bei der Erstellung und Ausführung einer Jar Datei AWT, Swing, JavaFX & SWT 2
G Verknüpfung einer pdf Datei AWT, Swing, JavaFX & SWT 2
N Ausführbare Datei aus JavaFX Projekt erstellen AWT, Swing, JavaFX & SWT 22
L Bilder werden in exportierter Datei nicht geladen AWT, Swing, JavaFX & SWT 6
L Csv-Datei einlesen AWT, Swing, JavaFX & SWT 34
J *.jar öffnet PDF-Datei nicht AWT, Swing, JavaFX & SWT 35
M JavaFX Altes Fenster (FXML Datei) löschen AWT, Swing, JavaFX & SWT 16
F Java FX Von der Fxml Datei zum Objekt AWT, Swing, JavaFX & SWT 8
A JavaFX Anwendung in Jar Datei AWT, Swing, JavaFX & SWT 8
F FXML Datei aus dem SceneBuilder in Eclipse aufrufen AWT, Swing, JavaFX & SWT 1
J Swing JavaProgramm für Verschlüssen für eine Datei AWT, Swing, JavaFX & SWT 19
T .jar-Datei lässt sich unflexibler ausführen als über die IDE AWT, Swing, JavaFX & SWT 11
Kanda Sorata Inhalt einer .txt Datei einlesen und in ein Label einfügen (JavaFX) AWT, Swing, JavaFX & SWT 2
H Musik wird nach dem erstellen der .jar Datei nicht mehr abgespielt AWT, Swing, JavaFX & SWT 1
H JavaFX aus der .fxml Datei einen Konstruktor bedienen AWT, Swing, JavaFX & SWT 3
P JavaFX - XCF Datei von Gimp kann nicht angezeigt werden AWT, Swing, JavaFX & SWT 3
M Wie binde ich eine JavaFX ProgressBar an eine Datei Übertragung? AWT, Swing, JavaFX & SWT 2
7 JavaFX Verwendung einer ResizableCanvas-Klasse in fxml-Datei AWT, Swing, JavaFX & SWT 3
C JavaFX Auf Nodes einer FXML-Datei in start Methode zugreifen AWT, Swing, JavaFX & SWT 5
F Pfad von eingelesener Datei AWT, Swing, JavaFX & SWT 10
Crazynet xls Datei in JTable AWT, Swing, JavaFX & SWT 3
D Objekte einer Oberfläche in eine Datei/Ordner speichern AWT, Swing, JavaFX & SWT 9
P Programm durch Dateiaufruf starten und Datei öffnen AWT, Swing, JavaFX & SWT 2
G .txt-Datei einlesen /formatieren in JTextfield ?? AWT, Swing, JavaFX & SWT 8
B ST Datei einlesen AWT, Swing, JavaFX & SWT 1
D JavaFX Jar Datei Signieren mit Java 8u45 AWT, Swing, JavaFX & SWT 2
M Datei mit Komponenten einbinden AWT, Swing, JavaFX & SWT 7
M Swing PDF Datei nach drucken nicht löschbar AWT, Swing, JavaFX & SWT 6
A Databinding in FXML-Datei AWT, Swing, JavaFX & SWT 1
H 2D-Grafik .EPS Datei in .PNG konvertieren AWT, Swing, JavaFX & SWT 1
G Datei öffnen Dialog modifizieren AWT, Swing, JavaFX & SWT 13
F Swing Java Swing Array in Datei und wieder raus AWT, Swing, JavaFX & SWT 7
L 2D-Grafik PNG Datei in JLabel Array Problem AWT, Swing, JavaFX & SWT 4
B JAVAFX und CSS Datei in Eclipse AWT, Swing, JavaFX & SWT 4
3 Swing JList-Inhalt als verschlüsselte Datei schreiben und lesen AWT, Swing, JavaFX & SWT 1
S Aus XML Datei FXML generieren AWT, Swing, JavaFX & SWT 4
V JavaFX - fxml-Datei laden (neben CSS) AWT, Swing, JavaFX & SWT 2
S Swing Verzeichnis/Datei-Pfad in JTextField schreiben AWT, Swing, JavaFX & SWT 2
A JFileChooser Datei speichern AWT, Swing, JavaFX & SWT 4
T Aus JAVA.Jar GUI eine Flash-Datei machen AWT, Swing, JavaFX & SWT 3
A Datei weiterverwenden mit JFileChooser AWT, Swing, JavaFX & SWT 6
A AWT TTF-Datei zu Font-Objekt finden? AWT, Swing, JavaFX & SWT 5
Iron Monkey Nach Drag & Drop die Datei auf Komponent darstellen AWT, Swing, JavaFX & SWT 2
J JFileChooser - Datei speichern AWT, Swing, JavaFX & SWT 7
M Datei in jar öffnen AWT, Swing, JavaFX & SWT 11
W Funktion aus einer Java Datei in eine andere einbauen AWT, Swing, JavaFX & SWT 25
P Neue Datei erstellen in JPanel AWT, Swing, JavaFX & SWT 5
N Speicherpfad für Datei auswählen AWT, Swing, JavaFX & SWT 2
A JTextArea - Zeichenbegrenzung nach .txt Datei import AWT, Swing, JavaFX & SWT 6
N Applet JButton soll html Datei aus einem Ordner öffnen AWT, Swing, JavaFX & SWT 2
E Swing jTextPane Text datei anzeigen AWT, Swing, JavaFX & SWT 7
M Datei Speichern unter Dialog - SWT AWT, Swing, JavaFX & SWT 3
T SWT:Datei speichern / öffnen AWT, Swing, JavaFX & SWT 6
X Applet Java Applet Datei Ausführung AWT, Swing, JavaFX & SWT 9
J Bild aus Datei in BufferedImage laden AWT, Swing, JavaFX & SWT 4
M Swing XML Datei in JTable darstellen + verändern AWT, Swing, JavaFX & SWT 3
D Swing JTable in Datei speichern und laden AWT, Swing, JavaFX & SWT 3
J Fehler beim Gif Datei öffnen AWT, Swing, JavaFX & SWT 2
N Swing TreePath Datei öffnen AWT, Swing, JavaFX & SWT 7
B Datei öffnen Dialog AWT, Swing, JavaFX & SWT 9
kodela Swing JFileChooser und die Datei-Extension AWT, Swing, JavaFX & SWT 3
T Info Datei AWT, Swing, JavaFX & SWT 3
J ImageIcon: ZipException bei ungültiger PNG-Datei AWT, Swing, JavaFX & SWT 2
W jar Datei öffnen AWT, Swing, JavaFX & SWT 4
W TrayIcon mit jdic (Problem bei .jar Datei) AWT, Swing, JavaFX & SWT 3
D Nodes eines statischen JTrees sollen auf Anker (Textmarken) in einer HTML-Datei zeigen AWT, Swing, JavaFX & SWT 8
M AWT Datei auf server speichern und beschreiben AWT, Swing, JavaFX & SWT 7
P JMenu-Erweiterung in externer Datei AWT, Swing, JavaFX & SWT 5
M Text in txt-Datei in letzte Zeile schreiben? AWT, Swing, JavaFX & SWT 14
X Swing Inhalt einer JEditorPane in Datei abspeichern AWT, Swing, JavaFX & SWT 5
E Datei in TextArea anzeigen AWT, Swing, JavaFX & SWT 12
data89 Nimbus Look and Feel als gepackte JAR-Datei AWT, Swing, JavaFX & SWT 3
S Auswahlfenster: Datei beim Doppelklick öffnen AWT, Swing, JavaFX & SWT 8
N Swing Hintergrund Bild in JAR Datei AWT, Swing, JavaFX & SWT 2
I Swing .Jar Datei - funktioniert - nun als Applet AWT, Swing, JavaFX & SWT 13
M Text-Datei in einem JFrame öffen? AWT, Swing, JavaFX & SWT 2
Fadi Images in JAR Datei laden? AWT, Swing, JavaFX & SWT 5
K Hyperlink als Datei identifizieren AWT, Swing, JavaFX & SWT 2
S Jar-Datei funktioniert nicht richtig AWT, Swing, JavaFX & SWT 3
1 Laden einer Datei zur Echtzeit Darstellen AWT, Swing, JavaFX & SWT 7
P Problem bei Datei zur Verwaltung von Tabs AWT, Swing, JavaFX & SWT 5
F png-Datei erstellen und einzelne Pixel schreiben AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben