Visualisierung von XML Dateien in einer Java SwingGui

TLow

Mitglied
Hallo zusammen,
und zwar stehe ich vor einem großen Problem. Meine Aufgabe ist es eine beliebige XML Datei in einer Java SwingGui zu visualisieren. Nach längerem recherchieren habe ich leider nichts geeignetes gefunden, was mir helfen könnte.
Ich muss gestehen, dass ich noch noch nicht so fit in Java bin. Deshalb fällt mir das ganze auch so schwer.

Aufgabe:
Ziel ist es eine Oberfläche mit Swing aufzubauen, die im linken Bereich eine Verzeichnisstruktur der XML-Tags als aufklappbare Ordner anzeigt. Im rechten Bereich sollen dann die Atribute eines gewählten Tag als Eingabefelder angezeigt werden.

Vorerst musste ich mir die Grundlagen der XML aneignen. Hier ist ein XML Code den ich mittels eines JTrees darstellen möchte.

[xml]
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mensch [
<!ELEMENT mensch (kopf)*>
<!ATTLIST mensch
name CDATA #REQUIRED
>
<!ELEMENT kopf (haare|augen)>
<!ELEMENT haare EMPTY>
<!ATTLIST haare
haarfarbe CDATA #REQUIRED
haarlaenge NMTOKEN #REQUIRED
>
<!ELEMENT augen EMPTY>
<!ATTLIST augen
augenfarbe CDATA #REQUIRED
sehstaerke NMTOKEN #REQUIRED
>
]>
<mensch name="Max">
<kopf>
<haare haarfarbe="braun" haarlaenge="3cm" />
<augen augenfarbe="blau" sehstaerke="-0.75" />
</kopf>
</mensch>
[/xml]

(Nur ein einfaches Beispiel. Die Attribute und deren Werte sollen später angezeigt werden).

Kennt ihr vielleicht eine Internetseite, die eine verständliche Einführung in ein solches Thema bietet?
Ich wäre auch sehr dankbar für Beispiel Codes. Mich würde es vorallem interessieren, wie ich die Attribute und deren Werte durch einen ausgewählten Tag angezeigen kann. Ich komme an dieser Stelle nicht weiter...

Java:
	@Override
	public void valueChanged(TreeSelectionEvent e) {
		JTree tree = (JTree) e.getSource();
	        XMLTreeNode selectedNode = (XMLTreeNode) tree.getSelectionPath().getLastPathComponent();

Klicke ich einen bestimmten Tag an wird immer nur die sehstaerke und augenfarbe ausgegeben. Auch dann, wenn ich auf das Element haare klicke.

Vielen Dank für eure Hilfe.
 
Probiers mal mit JDOM2
Ein kleines Beispiel:

Java:
doc = new SAXBuilder().build(xml_datei);
rootelement = doc.getRootElement();
list = rootelement.getChildren();
System.out.println(list.get(0).getAttributeValue("attribut_name"));

Xml Datei:
<xml>
<test attribut_name="bla"> </test>
</xml>
 
Zuletzt bearbeitet:

TLow

Mitglied
Vielen Dank für dein Beispiel, jedoch ist es nicht genau das was ich möchte. Sobald ich eine beliebige XML-Datei mithilfe des JTrees (Vorgehensweise noch unbekannt) darstelle möchte ich per klick auf ein Tag, dessen Attribute und Werte in einen Textfeld anzeigen.



Bisher funktioniert es noch nicht so richtig. Da immer dasselbe Attribut in der Console angezeigt wird...
 
Vielen Dank für dein Beispiel, jedoch ist es nicht genau das was ich möchte. Sobald ich eine beliebige XML-Datei mithilfe des JTrees (Vorgehensweise noch unbekannt) darstelle möchte ich per klick auf ein Tag, dessen Attribute und Werte in einen Textfeld anzeigen.



Bisher funktioniert es noch nicht so richtig. Da immer dasselbe Attribut in der Console angezeigt wird...

Ich verstehe schon was du möchtest :D
Und ich bin mir sicher es geht mit der Lib die ich oben genannt habe.
Du kannst ja mal dein Code posten
 

TLow

Mitglied
Problem hat sich erledigt, jedoch hat sich ein weiteres ergeben:

Ich möchte jetzt die Attribute im JTextArea anzeigen. Jedoch funktioniert das nicht so wirklich... Hier ein bisschen Code:
Java:
public class SwingGUI extends javax.swing.JFrame {

	{
		//Set Look & Feel
		try {
			javax.swing.UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
	private String holder = "";
	private JMenuBar jMenuBar;
	private JScrollPane scrollPane;
	private JTextField jTextField;
	private JMenu jMAuswahl;
	private JMenuItem jMISchließen, jMIOeffnen;
	private JTextArea jTextArea;
	private JPanel panel;

	/**
	* Auto-generated main method to display this JFrame
	*/
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				SwingGUI inst = new SwingGUI();
				inst.setLocationRelativeTo(null);
				inst.setVisible(true);
			}
		});
	}
	
	public SwingGUI() {
		super();
		 initGUI();
	}
	
	private void initGUI() {
	
		try {
			setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
					{
				
				panel = new JPanel();
				panel.setBorder(new EmptyBorder(5,5,5,5));
				setContentPane(panel);
				panel.setLayout(new GridLayout(1,2,5,5));
				
				scrollPane = new JScrollPane();
				panel.add(scrollPane);
			
			
				{
					/*jTextField = new JTextField();
					panel.add(jTextField);*/
					
					
				}
				{
					jTextArea = new JTextArea();
					jTextArea.setEditable(false);
					panel.add(jTextArea);
				}
				
			}

				jMenuBar = new JMenuBar();
				setJMenuBar(jMenuBar);
				{
					jMAuswahl = new JMenu("Auswahl");
					jMenuBar.add(jMAuswahl);
					{
						jMISchließen = new JMenuItem();
						jMAuswahl.add(jMISchließen);
						jMISchließen.setText("Schließen");
						jMISchließen.addActionListener(new ActionListener() {
							public void actionPerformed(ActionEvent evt) {
								jMISchließenActionPerformed(evt);
							}
						});
					}
					
						
						
						jMIOeffnen = new JMenuItem();
						jMAuswahl.add(jMIOeffnen);
						jMIOeffnen.setText("XML öffnen...");
						jMIOeffnen.addActionListener(new ActionListener(){
							public void actionPerformed(ActionEvent evt){
								
								
								
								JFileChooser fc = new JFileChooser();
								 FileNameExtensionFilter xmlfilter = new FileNameExtensionFilter(
							                "xml files (*.xml)", "xml");
							            fc.setFileFilter(xmlfilter);
								int state = fc.showOpenDialog(null);
								if(state == JFileChooser.APPROVE_OPTION){
									File selFile =  fc.getSelectedFile();
						
								try {
									
									SAXParserFactory factory = SAXParserFactory.newInstance();
									SAXParser saxParser = factory.newSAXParser();
									SimpleXMLHandler handler = new SimpleXMLHandler();
									InputStream input = new FileInputStream(new File(selFile.getPath()));
									saxParser.parse(input, handler);
									scrollPane.setViewportView(handler.getTree());
									
									
								} catch (Exception e) {
									e.printStackTrace();
								}
								
							
									
							}
							}
						});
						
					}
				
				
				
			pack();
			setSize(400, 300);
		} catch (Exception e) {
		    //add your error handling code here
			e.printStackTrace();
		}
	}
	
	private void jMISchließenActionPerformed(ActionEvent evt) {
		System.exit(0);
	}
	
	public void treeSelectionEvent(TreeSelectionEvent e){
		
		JTree tree = (JTree) e.getSource();
		
		XMLTreeNode selectedNode = (XMLTreeNode) tree.getLastSelectedPathComponent();
		
		
				if (selectedNode.getMap() != null) {
					Map<String, String> map = selectedNode.getMap();
					Set<String> keys = map.keySet();
					for(String key : keys){
						
						holder = "Attribut: " + key + " - " + map.get(key);
						System.out.println(holder);
						
						//System.out.println("Attribut: " + key + " - " + map.get(key));
					//jTextField.setText("Attribut: " + key + " - " + map.get(key));
					
					
			}
					jTextArea.setText(holder);
					panel.repaint();
					//JOptionPane.showMessageDialog(null,holder);
		
	}
				
	}
}

Code von einer anderen Klasse:

Java:
public JTree getTree() {

		JTree tree = new JTree(rootNode);
		tree.setRootVisible(false);
		tree.addTreeSelectionListener(new TreeSelectionListener() {

			
			public void valueChanged(TreeSelectionEvent e) {
			
				
			SwingGUI bsp = new SwingGUI();
			bsp.treeSelectionEvent(e);
				
			}

		});
		return tree;
	}

Das Ausgeben der Attribute und deren Werte verläuft in der Konsole reibungslos. Jedoch nicht das Hinzufügen in die Komponente JTextArea. Wo liegt hier der Fehler?
 

Harry Kane

Top Contributor
In der valueChanged Methode von "der anderen Klasse" legst du jedesmal eine neue Instanz von SwingGUI an. Da auf dieser neuen Instanz nie setVisible(true) aufgerufen wird, siehst du sie nicht.
Entweder gibst du "der anderen Klasse" eine Referenz auf eine existierende und sichtbar SwingGUI, oder du machst die SwingGUI gleich zum TreeSelectionListener deines JTree.
 

TLow

Mitglied
Ich bin grad etwas neben der Spur, wie bekomme ich den TreeSelectionListener in meine SwingGui? Ich arbeite schon 6 Stunden daran und kann das Problem nicht lösen....
 

Harry Kane

Top Contributor
Die "andere Klasse", von der du die getTree() methode gepostet hast, ist offenbar der SimpleXMLhandler, der in der initGui-Methode vion SwingGUI verwendet wird.
Sorge einfach dafür, das SwingGUI TreeSelectionListener implementiert, hänge ihn an den von handler.getTree() zurückgegebenen JTree, und schreibe in die valueChanged-Methode von SwingGUI (du musst diese Methoe erstellen, wenn SwingGUI TreeSelectionListener implementieren soll) einfach den Code rein, der zur Zeit noch in treeSelectionEvent-methode von SwingGUI steht.
nach welchem Buch/Kurs lernst du Java?
 

TLow

Mitglied
Vielen Dank, jedoch wenn ich ihn an den von handler.getTree() zurückgegebenen JTree hänge, gibt es einen Fehler.
Java:
scrollPane.setViewportView(handler.getTree());
Der Fehler lautet:
The method setViewportView(Component) in the type JScrollPane is not applicable for the arguments (void)

Außerdem, wie genau ist das gemeint? Ich habe den TreeSelectionListener implementiert und habe nach der Aufforderung die abstrakte Methode valueChanged implementiert. Den Inhalt von der anderen Methode treeSelectionEvent habe ich kopiert und in die valueChanged methode eingefügt. Nun kommt es aber zu komplikationen, entweder ich lese und verstehe deinen Satz nicht so richtig, oder ich mache was falsch.

Sorge einfach dafür, das SwingGUI TreeSelectionListener implementiert, hänge ihn an den von handler.getTree() zurückgegebenen JTree

Muss ich bei handler.getTree() nach der Klammer noch was einfügen? Z.B. handler.getTree().addTreeSelectionListener()... oder ist mein Ansatz falsch?


Zu deiner Frage, wie ich Java lerne:
Ich habe bereits 4 Bücher gelesen, die meisten aber nach 3/4 abgebrochen.
Mit folgenden Büchern habe ich mich beschäftigt:
-Einstieg in Java 7 (hat mir leider nicht gefallen, da zu wenige beispiel Codes vorhanden waren)
-Schrödinger programmiert Java (Tolles Buch, jedoch verliert man sehr schnell den Überblick, weshalb ich ein neues Buch besorgte)
-Programmieren lernen mit Java: Aktuell zu Java 7
-Java, Der umfassende Programmierkurs (noch dabei)

Video2Brain: Java 7 - Einstieg für Anspruchsvolle https://www.video2brain.com/de/videotraining/java-7

Ich habe mich die letzten Monate/Wochen sehr mit Java beschäftigt, jedoch habe ich die schlechte Eigenschaft, dass ich schnell die Sachen wieder vergesse...
 

Harry Kane

Top Contributor
Dann hast du offenbar den Rückgabetyp von handler.getTree() von JTree auf void geändert. Davon war aber in meinem Post nicht die Rede.
Und ja, nach handler.getTree() muss noch was stehen, und zwar handler.getTree().addTreeSelectionListener(this).
Dir fehlen offenbar noch ein paar grundlegende Sachen. Hast du schon mal etwas kleineres programmiert? Woher stammen die Codes, die du uns bisher gezeigt hast?
 

TLow

Mitglied
Die Codes wurden mir von einem Kollegen zur Verfügung gestellt.
Ich mache derzeit mein Studium und komme (vielleicht) ins 3 Semester. Je nach dem wie die Studienarbeit verläuft... Unser Dozent hat damals gesagt, wer hier studieren tut (DHBW) muss schon Programmiererfahrung mitbringen. Da ich auf einem Ernährungswissenschaftlichen Gymnasium war kam ich kaum mit Programmierung in Kontakt.

Wir haben in einer 3 stündigen Vorlesung Objektorientierung theoretisch vermittelt bekommen und das Thema abgeschlossen. So ging es die ganzen 2 Semester lang. Im 2 Semester haben wir eine Programmieraufgabe bekommen, die wir in Gruppen erledigen sollten. Jedoch war das keine Gruppenarbeit, sondern eher ne Einzelarbeit und die Klassen wurden dann später in einem Projekt zusammengefügt. Somit konnte ich wiederrum nichts von den anderen lernen und kaum einen Beitrag leisten.

Meine Programmierkenntnisse sind nicht wirklich gut, deshalb war ich auch nicht in der Lage selber diese Klassen zu schreiben. Mein Betreuer hat mir schließlich diese Codes zur Verfügung gestellt (3 Klassen). Für mich ist es schwer weiter daran zu arbeiten, da mir keinerlei Codes mit diesem Thema bekannt sind. (Die 3 Klassen dienten lediglich dazu eine XML-Datei in einem JFrame als JTree darzustellen. Den Rest habe ich selber gemacht).
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Visualisierung von Daten XML & JSON 13
Kanda Sorata Eingabefelder von Excel Dateien auslesen XML & JSON 1
ms_cikar Excel Dateien über Dropbox zugreifen XML & JSON 0
D Große XML-Datei in einzel Dateien splitten XML & JSON 3
A Elemente aus mehreren XML-Dateien zu einem zusammenfügen XML & JSON 5
X JDom für SOAP Dateien geeignet? XML & JSON 3
L compareto(), equals() in JAXB generierten Dateien XML & JSON 3
M Zwei XML-Dateien joinen XML & JSON 3
D xhtml Dateien splitten via DOM Tree XML & JSON 2
F XML unerlaubte Zeichen aus Dateien entfernen XML & JSON 9
E JDOM - Problem beim Zusammenfügen zweier Dateien XML & JSON 2
Mike90 -xlsx Dateien in Java lesen XML & JSON 3
Y xmlbeans und DTD Dateien XML & JSON 2
S Vergleichen von 2 XML Dateien XML & JSON 2
H XML-Datei in einzelne XML-Dateien zerlegen XML & JSON 2
P XML Dateien zusammenführen und in eine XML speichern XML & JSON 7
I RDF Dateien XML & JSON 3
S XMl Dateien in Java schreiben XML & JSON 4
W Erzeugen einer openapi spec via swagger XML & JSON 1
W Erzeugen einer Handlerklasse zum Abfangen von SOAP-Requests XML & JSON 13
D Innerhalb einer Property auf eine andere verlinken? XML & JSON 3
J Auslesen der Länge einer XML-Datei in Android Studio XML & JSON 8
S Validierung einer XML-Datei - Führende Leerzeichen und Tabs XML & JSON 10
M Layout + Inhalt einer JTable speichern XML & JSON 30
J Welche Gründe führen zu einer endlos tiefen XML? XML & JSON 4
T Pfad in einer Variablen speichern XML & JSON 1
E Wie kann ich ein XSD-Schema in einer JSP-Seite verwenden? XML & JSON 7
R XSD in einer choice mehrmals das selbe element möglich XML & JSON 5
S Xml File für den Aufbau einer anderen Xml Datei XML & JSON 6
C XPath: Alle Kinder in einer Schleife auslesen XML & JSON 2
K Beim Parsen einer XML-Datei Connection timed out XML & JSON 4
F Parsen von Daten aus einer Homepage XML & JSON 6
B XML aus einer URL im Internet lesen (JDOM) XML & JSON 4
D Aus lesen einer XML-Datei ( 1 root, 3 childs) XML & JSON 7
B SAX-Parser - Dokumente einlesen und in einer Map ablegen XML & JSON 2
B 2 Attribute in einer xsl XML & JSON 2
T Inhalt einer .xml Datei auf Javaoberfläche wiedergeben XML & JSON 4
T Schreiben einer XML XML & JSON 8
B XML auf Basis einer DTD erstellen XML & JSON 2
hdi Probleme beim Erstellen einer XML XML & JSON 7
O Parsen einer XML mit JDOM ohne Doctype Declaration XML & JSON 2
T XPath Problem: finden einer Node nach Attributswert XML & JSON 2
sylo Mehrere XSDs und mehrere Namensräume in einer XML unterbringen? XML & JSON 2
Nicer Bestimmten Wert aus einer XML Auslesen XML & JSON 34
sylo Beim Erzeugen einer XML Datei auch die XML Struktur erzeugen? XML & JSON 11
J xmlencoder Zustände einer Bean schreiben XML & JSON 3
N value Wert einer XML Datei mit JAVA bearbeiten XML & JSON 21
S Probleme beim erstellen einer Jar XML & JSON 12
J Problem mit compile einer XSD XML & JSON 3
S Einlesen einer xml Datei XML & JSON 4
F hilfe bei einer aufgabe XML & JSON 3
D Anzahl der Knoten in einer XML XML & JSON 6
R Parsen einer XML ohne Validierung XML & JSON 2
D XML Datei innerhalb einer JAR Datei parsen XML & JSON 2
M Xerces -Parsen mit einer externen Schemadatei geht nicht XML & JSON 2
cybermat Ergebnis einer XSLT-Tansformation als Rückgabewert erhalten XML & JSON 4
J Fehler beim laden einer .xml XML & JSON 3
ven000m Übungsaufgabe: Valide und gültige XML Datei zu einer DTD XML & JSON 7
A Auslesen einer XML Datei XML & JSON 58
P OutOfMemoryError beim Einlesen einer XML-Datei XML & JSON 7
P Knoten-Attribute einer xsd-Datei in einem JTree auslesen XML & JSON 18
T Einfach nur die Elemente einer XML Datei auslesen :( XML & JSON 10
Z Erzeugung einer Referenz von Knoten in JTree auf DOMTree XML & JSON 3
A Element an einer bestimmten Stelle einfügen (nicht am Ende) XML & JSON 4

Ähnliche Java Themen

Neue Themen


Oben