Problem beim XML-Parsen

Status
Nicht offen für weitere Antworten.

buster

Mitglied
Hallo,

das Problem hat zwar mit XML zu tun, ist aber wahrscheinlich doch eher ein Anfängerfehler.
Ich habe mir einen DOM-Parser geschrieben, mit Darstellung in Baumstruktur. Die XML-Datei soll dabei frei gewählt werden können (ist schon realisiert). Das Parsen der ersten Datei funktioniert auch problemlos, doch wenn ich eine andere Datei selektiere, wird sie im Baum nicht richtig dargestellt :(
Der Fehler schein auch nicht beim Parsen zu liegen, sondern eher bei der Darstellung als Baum, hier werden mir (teilweise) noch die alten Elemente angezeigt.

Hier mal kurz der relevante Code:
Code:
	protected void parseFile(String xmlfile) {
		try {
			DOMParser parser = new DOMParser();
			parser.parse(xmlfile);		
			//Document doc = null;
			Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); 
			
			doc = parser.getDocument();
			Element wurzel = doc.getDocumentElement(); 
			AdapterNode.setTreeElementNames(0, wurzel.getNodeName());
			// HTML-Formular erzeugen
			final HTMLFormular htmlPane = new HTMLFormular();
			// XML-Dokument in Baum umwandeln
			DefaultMutableTreeNode rootnode = new AdapterNode(doc);
			DefaultTreeModel treemodel = new DefaultTreeModel(rootnode);
			JTree tree = new JTree(treemodel);
			tree.setRootVisible(false); // root(leer) wird nicht angezeigt
			// linkes Fenster (Baumstruktur)
			final JScrollPane sp1 = new JScrollPane(tree);
			sp1.setBorder(BorderFactory.createEtchedBorder());
			sp1.setPreferredSize(new Dimension(400,250));
			// rechtes Fenster (HTML)
			final JScrollPane sp2 = new JScrollPane(htmlPane);
			sp2.setBorder(BorderFactory.createEtchedBorder());
			sp2.setPreferredSize(new Dimension(450,250));
			sp2.setLayout(new ScrollPaneLayout());
	
			JSplitPane splitpane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,sp1,sp2);
			getContentPane().add(splitpane, BorderLayout.CENTER);
			// Reaktion auf Selektion im Baum
			tree.addTreeSelectionListener(new TreeSelectionListener() {
				public void valueChanged(TreeSelectionEvent e) {
					TreePath p = e.getNewLeadSelectionPath();
					if ( p != null) {
						final AdapterNode node = (AdapterNode) p.getLastPathComponent();
						/*###########################*/
						String htmlText = "<form><table>" + node.zeige() + "<tr><td colspan=\"10\"><input type=\"submit\"></td></tr></table></form>";
						htmlPane.setText(htmlText);
						
						htmlPane.addPropertyChangeListener("data", new PropertyChangeListener() {
				            public void propertyChange(PropertyChangeEvent evt) {
				            	htmlPane.getData(htmlPane,AdapterNode.alFListe);
				            	node.saveXML(htmlPane);
			            }
				        });
						/*###########################*/
					}
				}
				
			});
			getContentPane().setVisible(true);
			getContentPane().validate();
			getContentPane().repaint();
		}
		// Fehlerbehandlung
		catch (Exception err){
			System.err.println("\nFehler");
			err.printStackTrace();
			System.exit(1);
		}

und die Klasse AdapterNode
Code:
public class AdapterNode extends DefaultMutableTreeNode {

	protected Node node;
	
	//Konstruktor
	public AdapterNode(Node node) {
		super(node);
		this.node = node;
	}

Wahrscheinlich habe ich irgendwo was nicht richtig initialisiert oder so...

Bin für jegliche Hilfe (oder auch nur Schubser in die richtige Richtung) dankbar.

Beste Grüße,
der Buster
 

foobar

Top Contributor
Warum baust du denn deine GUI komplett neu auf, wenn du das File geparsed hast?
Parse doch einfach das XML-File und übergibt die Daten dem Treemodel. Das Model informiert dann den JTree über die Änderungen.
 

buster

Mitglied
Hmm, ja, mir ist da allerdings nicht ganz klar, wie ich den Code dann organisieren muss. Also erst mal die Scrollpanels ausserhalb von parseFile erzeugen. Den tree dann auch? Das treemodel wird doch erst beim Parsen erzeugt? Muss ich dafür dann eine neue Klasse schreiben? (OK, ich gebs ja zu, ich hab (noch) keinen blassen Schimmer, aber ich geb mir Mühe...)

Beste Grüße und danke,
der Buster
 

foobar

Top Contributor
Zuerst erzeugst du die komplette Gui und positionierst die Steuerelemente. Wenn dann die Methode parseFile aufgerufen wird, holst du dir vom JTree das Model und übergibst ihm die neuen Daten. Das ist alles.

Guck dir mal die Tutorials ui Swing hier in der FAQ an, dann wirst du sehen was ich meine.

(OK, ich gebs ja zu, ich hab (noch) keinen blassen Schimmer, aber ich geb mir Mühe...)
Das ist die Hauptsache ;-)
 

buster

Mitglied
Aha.
Die FAQs sind wirklich Klasse, ich werde mir das mal zu Gemüte führen :### .
Da kommt ja noch ne Menge Arbeit auf mich zu...

Vielen Dank jedenfalls erst mal, ich bin schon dabei, die nächsten Anfängerfragen zu erzeugen :)
 

buster

Mitglied
Ich glaub, ich habs jetzt verstanden:
Also statt void für parseFile den Rückgabewert als TreeNode, und den dann an tree übergeben. Probier ich gleich mal aus :)
 

buster

Mitglied
So, jetzt muss ich sicher noch irgendwo den TreeModelListener reinhängen. Aber wo? Und was soll er auslösen? repaint ?
Code:
	public DOMParser1_1() {

		new Dir();
		final String[] files = Dir.getFiles();
		for ( int i = 0; i < files.length; i++ ) {
			final String fd = files[i];
			datei.add(new AbstractAction( fd, new ImageIcon(getClass().getResource("filexml.gif"))) { 
				public void actionPerformed(ActionEvent e) {
					root = parseFile(fd);
				} 
			});
		}
		// linkes Fenster (Baumstruktur)
		DefaultTreeModel treemodel = new DefaultTreeModel(root);
		JTree tree = new JTree(treemodel);
		tree.setRootVisible(false); // root(leer) wird nicht angezeigt
		final JScrollPane sp1 = new JScrollPane(tree);
		sp1.setBorder(BorderFactory.createEtchedBorder());
		sp1.setPreferredSize(new Dimension(400,250));
		// rechtes Fenster (HTML-Fragebogen)
		final HTMLFormular htmlPane = new HTMLFormular();
		final JScrollPane sp2 = new JScrollPane(htmlPane);
		sp2.setBorder(BorderFactory.createEtchedBorder());
		sp2.setPreferredSize(new Dimension(450,250));
		sp2.setLayout(new ScrollPaneLayout());
		JSplitPane splitpane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,sp1,sp2);
		getContentPane().add(splitpane, BorderLayout.CENTER);
		// Reaktion auf Selektion im Baum
		tree.addTreeSelectionListener(new TreeSelectionListener() {
			public void valueChanged(TreeSelectionEvent e) {
				TreePath p = e.getNewLeadSelectionPath();
				if ( p != null) {
					final AdapterNode node = (AdapterNode) p.getLastPathComponent();
					/*###########################*/
					String htmlText = "<form><table>" + node.zeige() + "<tr><td colspan=\"10\"><input type=\"submit\"></td></tr></table></form>";
					htmlPane.setText(htmlText);
					
					htmlPane.addPropertyChangeListener("data", new PropertyChangeListener() {
			            public void propertyChange(PropertyChangeEvent evt) {
			            	htmlPane.getData(htmlPane,AdapterNode.alFListe);
			            	node.saveXML(htmlPane);
			            }
			        });
					/*###########################*/
				}
			}
			
		});
		// Fenster anzeigen
		pack();
		setVisible(true);
		validate();
		repaint();
	}
 

foobar

Top Contributor
Du brauchst keinen TreeListener und auch kein repaint. Was du brauchst ist ein TreeModel dem du die Methode setData(MyXmlDoc data) verpasst.

Code:
class MyXmlTreeModel implements TreeModel
{
   // alle Methoden von TreeModel implementieren


   public void setData(MyXmlData data)
   {
        this.data = data;
        fireTreeDataChanged();
   }

Wenn du die Methode setData aufrufst wird der Jtree automatisch neu gerendert. Guck dir mal die Tutorials zu Swing in der FAQ an.
 

buster

Mitglied
Hallo, bin wieder da :wink:

Mit den Tutorials sind sicher die zum GUI und speziell zu JTree gemeint? Da bin ich grad am durcharbeiten. Aber mir scheint, da wird der Weg über die Listener bevorzugt...

fireTreeDataChanged() scheint ja keine Standardfunktion zu sein, hab da bloss was auf einer japanischen Seite gefunden :( Müsste ich die dann auch noch schreiben, mit dem entsprechenden TreeModelEvent?? :bahnhof: Oder meinst du da eine andere Funktion?

Beste Grüße,
der Buster
 

buster

Mitglied
Hallo,

irgendwie bin ich nach dem Durchlesen von API und HowTo ziemlich verwirrt, da entsteht grad irgendwo ein Knoten in meinem Hirn ;)

Da bei mir der ganze Baum neu dargestellt werden soll (aus einer völlig anderen XML-Datei), sind die Standard-Fire-Methoden wohl nicht so günstig(z.B. fireTreeStructureChanged(Object source,Object[] path, int[] childIndices,Object[] children) -> source wäre ja dann der neue root, path ist auch klar, aber die ganzen Kinderlein??? *verzweifel*). Da gefällt mir dieses "fireTreeDataChanged()" schon besser, aber wie muss ich das implementieren? Was wäre an dieser Stelle dann "data"? Das neue Wurzelelement?

Ein kleines Beispiel wäre echt nett und hilfreich...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
C GLOOP Problem beim Erstellen der Kamera Java Basics - Anfänger-Themen 9
sserio Problem beim Anzeigen Java Basics - Anfänger-Themen 5
I Output BigDecimal anstatt double / Problem beim Rechnen Java Basics - Anfänger-Themen 16
P Problem beim Überschreiben einer vererbten Methode Java Basics - Anfänger-Themen 4
J Problem beim vergleich von zwei Integer Java Basics - Anfänger-Themen 3
G Problem beim Speichern von Objekten in einer Datei Java Basics - Anfänger-Themen 7
S Collections funktionale Listen (ListNode<E>) review und problem beim clone Java Basics - Anfänger-Themen 0
C Methoden Problem beim Speichern von Variablen Java Basics - Anfänger-Themen 1
F Problem beim entfernen von mehreren Listenelementen auf einmal (Programmierung des Spiels Arschloch) Java Basics - Anfänger-Themen 1
B Problem beim grundsätzlichen Verständnis bei Rekursion mit 2-dimensionalen Array Java Basics - Anfänger-Themen 6
E Datentypen Problem beim Speichern von enum. Java Basics - Anfänger-Themen 10
A Problem beim Deklarieren von einem BOOLEAN Java Basics - Anfänger-Themen 4
B Gleicher Prozess starten und stoppen (Problem beim Stoppen) Java Basics - Anfänger-Themen 5
DestinatioN Problem beim splitten eines Satzes in Wörter und die Wörter in Buchstaben Java Basics - Anfänger-Themen 2
B Problem beim Angeben einer Eingabe Java Basics - Anfänger-Themen 12
J Encoding Problem beim Einlesen einer txt Datei mit Umlauten Java Basics - Anfänger-Themen 3
R Problem beim Wochenplan (Datum,Wochentag) Java Basics - Anfänger-Themen 30
D Problem beim umwandeln eines Strings in eine Dzezimalzahl Java Basics - Anfänger-Themen 6
A Compiler-Fehler Problem beim einbinden der applet Klasse Java Basics - Anfänger-Themen 2
L Compiler-Fehler Problem beim Programmieren eines Kalenders (java.lang.ArrayIndexOutOfBoundsException) Java Basics - Anfänger-Themen 2
C Problem beim laden eines BufferedImage Java Basics - Anfänger-Themen 2
D Problem beim Lesen einer txt-Datei Java Basics - Anfänger-Themen 8
fLooojava Bluetooth Projekt - Problem beim mehrmaligen Senden Java Basics - Anfänger-Themen 5
E Problem beim Übergeben von Parameter an Methode Java Basics - Anfänger-Themen 2
Z Problem beim Lesen und Schreiben einer Datei Java Basics - Anfänger-Themen 10
R Problem beim erstellen eines neuen Klassenobjekts Java Basics - Anfänger-Themen 2
F Input/Output Problem beim einlesen eines Strings Java Basics - Anfänger-Themen 3
J Problem beim auslesen von Int Wert aus YML-Datei Java Basics - Anfänger-Themen 6
P Problem beim Abschluss im Kompositum Java Basics - Anfänger-Themen 3
M Problem mit null pinterexception beim laden von Bildern Java Basics - Anfänger-Themen 20
K Problem beim Array aufruf Java Basics - Anfänger-Themen 4
J Problem beim ausführen in cmd.exe Java Basics - Anfänger-Themen 4
J Variablen Problem beim einlesen einer Zahl Java Basics - Anfänger-Themen 7
A Problem beim Compilieren Java Basics - Anfänger-Themen 11
J Problem beim Fenster Java Basics - Anfänger-Themen 4
tux20 Problem beim Schreiben von List to File Java Basics - Anfänger-Themen 2
M Problem beim Compilieren Java Basics - Anfänger-Themen 14
Maxim6394 Problem beim Abspielen von Sounds Java Basics - Anfänger-Themen 8
S Problem beim ersten compilieren überhaubt Java Basics - Anfänger-Themen 43
H Problem beim lesen des InputStreams von einem Subprozess Java Basics - Anfänger-Themen 4
Luk10 Problem beim .jar Datei erstellen Java Basics - Anfänger-Themen 19
L Problem beim Ausführen Java Basics - Anfänger-Themen 40
A Problem beim einfügen in eine Datenbank Java Basics - Anfänger-Themen 2
E Problem beim Programmieren eines Kartenspiels Java Basics - Anfänger-Themen 3
A Problem beim Ausführen einer .jar datei auf externen System Java Basics - Anfänger-Themen 5
M Problem beim compilieren Java Basics - Anfänger-Themen 6
JAVAnnik problem beim lvl laden Java Basics - Anfänger-Themen 15
L Problem beim Einlesen einer Datei in einen String Java Basics - Anfänger-Themen 12
W Problem beim erstellen eines Tests Java Basics - Anfänger-Themen 16
JAVAnnik Problem beim Objekt bewegen Java Basics - Anfänger-Themen 20
A Erstes Programm - Problem beim Ausführen als jar Java Basics - Anfänger-Themen 3
S Problem beim Speichern und Laden von Daten Java Basics - Anfänger-Themen 13
B Problem beim Abspielen einer Videodatei Java Basics - Anfänger-Themen 4
S Problem beim Erstellen eines Scanner-Objekts Java Basics - Anfänger-Themen 7
W Problem beim CSV-Import Java Basics - Anfänger-Themen 5
M Datentypen Problem beim zusammenstellen eines Abfrage-Strings Java Basics - Anfänger-Themen 3
K Collections Problem beim import von Packages Java Basics - Anfänger-Themen 10
S Problem beim Kompilieren - cannot find symbol - constructor() Java Basics - Anfänger-Themen 12
B Problem beim Email versenden mit Javamail Java Basics - Anfänger-Themen 5
H Problem beim Anfang von Java (Java Editor) Java Basics - Anfänger-Themen 2
I Problem beim Schreiben eines ersten Programms Java Basics - Anfänger-Themen 3
D Problem beim Zeichnen von "Das Haus vom Nikolaus" Java Basics - Anfänger-Themen 10
D Problem beim Auslesen aus File Java Basics - Anfänger-Themen 3
A Problem beim Splitten eines Strings Java Basics - Anfänger-Themen 10
S Problem mit ObjectInputStream beim Einlesen von LinkedList Java Basics - Anfänger-Themen 3
J Problem beim Löschen von elementen aus einer ArrayList Java Basics - Anfänger-Themen 5
V Problem beim Programm laden Java Basics - Anfänger-Themen 5
H Problem beim kompilieren Java Basics - Anfänger-Themen 3
C ActionListener problem beim starten von programmen Java Basics - Anfänger-Themen 3
4 OOP Problem beim Speichern verschiedener Klassen in verschiedenen Dateien Java Basics - Anfänger-Themen 25
T Problem beim Returnwert einer Methode Java Basics - Anfänger-Themen 12
M line.separator: Problem beim Lesen einer Datei Java Basics - Anfänger-Themen 11
Miladriel Problem beim Neuzeichnen nach deiconify Java Basics - Anfänger-Themen 9
R Problem beim Ausführen von Java-PGM aus der shel Java Basics - Anfänger-Themen 3
G Problem beim Sortieren einer Liste Java Basics - Anfänger-Themen 20
M Problem beim Ereignishandling mit Menü Java Basics - Anfänger-Themen 2
H problem beim zeichen im JFrame Java Basics - Anfänger-Themen 6
F Problem beim Objekteaufruf... Java Basics - Anfänger-Themen 4
E BlockChallenge: Problem beim löschen der Blöcke Java Basics - Anfänger-Themen 3
H Problem beim Verkürzen von Programm Java Basics - Anfänger-Themen 3
T Problem beim Werfen und Fangen von Exceptions Java Basics - Anfänger-Themen 2
M Problem beim Zugriff auf Daten GUI + Startklasse Java Basics - Anfänger-Themen 4
P Problem beim Thread Java Basics - Anfänger-Themen 20
0 problem beim Polygon zeichnen Java Basics - Anfänger-Themen 3
V Problem beim erstellen eines ausführbaren Programs Java Basics - Anfänger-Themen 5
0 Problem beim Starten des Applets Java Basics - Anfänger-Themen 2
N Problem beim Durchsuchen einer LinkedList Java Basics - Anfänger-Themen 5
G Problem beim Programmieren von Blackjack Java Basics - Anfänger-Themen 15
R Problem beim Laden eines Images Java Basics - Anfänger-Themen 7
K Problem beim installieren des JDK 1.6+ version Java Basics - Anfänger-Themen 3
T Problem beim Konsolenstart Java Basics - Anfänger-Themen 5
C Problem beim Berechnen der Quadratwurzel Java Basics - Anfänger-Themen 3
C Problem beim nutzen von Teilprogrammen in main Java Basics - Anfänger-Themen 2
M Problem beim Zeichnen Java Basics - Anfänger-Themen 5
D Problem beim Kompilieren Java Basics - Anfänger-Themen 4
D Problem beim auslesen von TextArea Java Basics - Anfänger-Themen 3
G Problem beim Schreiben in Textdatei Java Basics - Anfänger-Themen 9
F ggT finden - problem beim qc Java Basics - Anfänger-Themen 4
S Problem mit url, inputStream und bytes beim Quellcode laden. Java Basics - Anfänger-Themen 6
G Habe ein Problem mit syn-Editor ( beim compilieren) Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben