XML-Datei in JTree einlesen mittels JDOM

raffi

Grünschnabel
Hallo,
ich sitze derzeit an einem Programm was eine von mir selbst erstellte XML Datei in einen JTree einlesen soll und dementsprechend auch darstellen soll.
Code:
<?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>xxxt</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>

Nun habe ich konkret Probleme beim Einlesen, sobald ich die Kinder der Professuren, also die Veranstaltungen einfügen muss.
Die zugehörigen Methoden sehen derzeit so aus:
Code:
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;
	}
	
	@SuppressWarnings("unchecked")
	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();               //alte Variante die natürlich so nicht funktionieren kann
				for (int j = 0; j < vList.size(); j++) {
					Element childEl = (Element)vList.get(j);
					childNode.add(createVeranstNode(childEl));
					return childNode; 
				}*/
				createVeranstNode(dummyEl);
			}
		}
		return new DefaultMutableTreeNode(new Professur(profName, mail, forschung));
	}
	
	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 möchte ich einen extra Baum aufbauen umd diesen dann zurückzugeben und an den eigentlichen Baum anzuhängen. Ist das möglich?
		}
		
		//System.out.println(veranstName+" "+verantwortlicher+" "+raum+" "+typ);
		return new DefaultMutableTreeNode(new Lehrveranstaltung(veranstName, verantwortlicher, raum, typ)); // hier sollte dann natrülich der Baum zurückgegeben werden
	}
ist das so möglich oder sollte ich anders vorgehen?

MfG
 
Zuletzt bearbeitet:
Hallo,
also ich hab das Problem gelöst und es funtkioniert jetzt. Nun möchte ich den JTree aber wiederum speichern, natürlich in einer XML Datei. Wenn ich mir jedoch das root-Element (model.getRoot()) hole kann ich dieses nicht zu JDOM-Element casten...
Wie umgehe bzw. löse ich dieses Problem?

MfG
 
Zurück