XML in JTable Einlesen

ShakalX

Grünschnabel
Hey Leute ,

Könnte mir Jemand ein Codebeispiel dafür geben wie ich dieses
Code:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<music>
    <MP3>
        <track>4</track>
        <title>Unbekannter Soldat</title>
        <artist>Annett</artist>
        <length>5.0</length>
        <album>Weil es so ist</album>
    </MP3>
</music>

in eine JTable einlesen kann. Ich habe ein JTableModel und übergebe dieses Model die XML datei nachdem ich sie erstellt habe.
Nun komme ich nicht weiter
das ist das Model zur Tabele

Code:
import java.util.Vector;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableModel;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
 
public class ModelTable implements TableModel {
    private Vector mp3file = new Vector();
    private Vector listeners = new Vector();
 
    public void addTableModelListener(TableModelListener listener) {
        listeners.add(listener);
    }
 
    public void removeTableModelListener(TableModelListener listener) {
        listeners.remove(listener);
    }
 
    public void addTrack(String string) {
        try {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.parse(string);//String = XML file
 
        } catch (Exception e) {
            e.printStackTrace();
        }
 
    }
 
    // Eine Angabe, welchen Typ von Objekten in den Columns angezeigt werden
    // soll
    public Class getColumnClass(int columnIndex) {
        switch (columnIndex) {
        case 0:
            return Integer.class;
        case 1:
            return String.class;
        case 2:
            return String.class;
        case 3:
            return Float.class;
        case 4:
            return String.class;
        default:
            return null;
        }
    }
 
    public int getColumnCount() {
        return 5;
    }
 
    public String getColumnName(int column) {
        switch (column) {
        case 0:
            return "Track";
        case 1:
            return "Titel";
        case 2:
            return "Künstler";
        case 3:
            return "Zeit";
        case 4:
            return "Album";
        default:
            return null;
        }
    }
 
    public int getRowCount() {
        return 0;
    }
 
    public Object getValueAt(int rowIndex, int columnIndex) {
        return 0;
    }
 
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return true;
    }
 
    public void setValueAt(Object arg0, int arg1, int arg2) {
        // TODO Auto-generated method stub
 
    }
 
}
 
Das tut mir leid .... Hätte ich mal vorher sehen müssen.

in eine Liste hat ich es schon gespeichert nur wenn ich diese liste dann abarbeite und diese in die Tabelle anfügen will erscheint kein Element bzw keine Zeile mit Informationen
 
Das tut mir leid .... Hätte ich mal vorher sehen müssen.

in eine Liste hat ich es schon gespeichert nur wenn ich diese liste dann abarbeite und diese in die Tabelle anfügen will erscheint kein Element bzw keine Zeile mit Informationen
Wieso anfügen?

Das Model enthält die Daten und muß diese in den entsprechenden Methoden zurückgeben.

getRowCount sollte zuallererst mal nicht 0 zurückgeben, sondern die anzahl der Einträge.

Dann solltest du evlt. auch noch die Listenener über eine Änderung der Daten informieren.

Zeig deinen Code.
 
hab es Hingekriegt wahrscheinlich etwas Dreckig aber es kommt was
Code:
import java.util.Vector;

import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableModel;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class ModelTable implements TableModel {
	private Vector mp3file = new Vector();
	private Vector listeners = new Vector();
	private NodeList nList;
	private Document doc;

	public void addTableModelListener(TableModelListener listener) {
		listeners.add(listener);
	}

	public void removeTableModelListener(TableModelListener listener) {
		listeners.remove(listener);
	}

	public void addTrack(String string) {
		int index = mp3file.size();
		mp3file.add(string);

		try {
			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
			DocumentBuilder db = dbf.newDocumentBuilder();
			doc = db.parse(string);
			nList = doc.getElementsByTagName("MP3");

		} catch (Exception e) {
			e.printStackTrace();
		}
		TableModelEvent e = new TableModelEvent(this, index, index,
				TableModelEvent.ALL_COLUMNS, TableModelEvent.INSERT);

		for (int i = 0, n = listeners.size(); i < n; i++) {
			((TableModelListener) listeners.get(i)).tableChanged(e);
		}
	}

	private static String getTagValue(String sTag, Element eElement) {
		NodeList nlList = eElement.getElementsByTagName(sTag).item(0)
				.getChildNodes();

		Node nValue = (Node) nlList.item(0);

		return nValue.getNodeValue();
	}

	// Eine Angabe, welchen Typ von Objekten in den Columns angezeigt werden
	// soll
	public Class getColumnClass(int columnIndex) {
		switch (columnIndex) {
		case 0:
			return String.class;
		case 1:
			return String.class;
		case 2:
			return String.class;
		case 3:
			return String.class;
		case 4:
			return String.class;
		default:
			return null;
		}
	}

	public int getColumnCount() {
		return 5;
	}

	public String getColumnName(int column) {
		switch (column) {
		case 0:
			return "Track";
		case 1:
			return "Titel";
		case 2:
			return "Künstler";
		case 3:
			return "Zeit";
		case 4:
			return "Album";
		default:
			return null;
		}
	}

	public int getRowCount() {
		return mp3file.size();
	}

	public Object getValueAt(int rowIndex, int columnIndex) {

		for (int temp = 0; temp < nList.getLength(); temp++) {
			Node nNode = nList.item(temp);
			if (nNode.getNodeType() == Node.ELEMENT_NODE) {

				Element eElement = (Element) nNode;
				switch (columnIndex) {
				case 0:
					return getTagValue("track", eElement);
				case 1:
					return getTagValue("title", eElement);
				case 3:
					return getTagValue("artist", eElement);
				case 4:
					return getTagValue("length", eElement);
				case 5:
					return getTagValue("album", eElement);
				default:
					return null;
				}
			}
		}
		return null;

	}

	public boolean isCellEditable(int rowIndex, int columnIndex) {
		return true;
	}

	public void setValueAt(Object arg0, int arg1, int arg2) {
		// TODO Auto-generated method stub

	}

}

Aber nun habe ich Einanderes problem, füge ich nun Einanderes Lied hinzu ändert er bei allen Zeilen dne inhalt auf das gerade hinzugefügt lied
 
Zuletzt bearbeitet:
Du hast ja auch nur eine nList. Die setzt du auf die zuletzt über addTrack hinzugefügte Instanz des letzten Ergebnisses von doc.getElementsByTagName("MP3")

Ich weiß ja nicht was du tatsächlich vorhast, aber es würde die Sache erheblich vereinfachen, wenn du eine Trennung zu deiner Datenhaltung und des Tabellenmodells einführen würdest:
Java:
class Track {
  private String track;
  private String titel;
  private String künstler;
  private String zeit;
  private String album;

  public Track (String track, String titel, String künstler, String zeit, String album) {
     ...
  }

  public String getTrack() { return track; }
  ...
}

public class TrackTableModel implements TableModel {
  private List<Track> tracks;

  
  public void add(Track track) {
     tracks.add(track);
     ... // notify listeners
  }

  public Object getValueAt(int rowIndex, int columnIndex) {
    Track t = tracks.get(rowIndex);
    switch (columnIndex) {
       case 0: return t.getTrack();
       ...
    }
  }
}
 
so habe ich das ja auch .... und das werde ich jetzt mal versuchen ... meine eigentliche Aufgabe ist es aus einer MP3 Datei einige Daten heraus lesen wie Artist title etc diese in einer XML Datei abspeichere diese XML Datei Validiere den Inhalt über eine GUI anzeigen lasse. Zusätzlich soll man die Daten verändern können und diese sollen sich wieder in die MP3 reinschreiben. Darüber hinaus soll ich einen Server Realisieren der sich mit dem Clienten über eine einfache Registration verbindet alle Daten abgleicht und daraus eine Webseite erstellt diese Webseite soll man dann über den Clienten anpassen können zb wie sollen die Lieder Sortiert sein

das mit der Liste probiere ich jetzt mal dazu ist es nachher dann noch einfacher die Daten wieder abzuspeichern

Code:
  public Object getValueAt(int rowIndex, int columnIndex) {
    Track t = tracks.get(rowIndex);
    switch (columnIndex) {
       case 0: return t.getTrack();
       ...
    }
  }

Da ist nun das Problem das er
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl cannot be cast to Track
at ModelTable.getValueAt(ModelTable.java:126)
herraus gibt

und wenn ich es so veränder das ich kein Doc übergebe sondern die Tracklist kann der vector nicht zu track gecastet werden

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.util.Vector cannot be cast to Track

//EDIT 3
okay hat alles geklappt er Fügt alle ein aus der tracklist .... Nächster teil Informationen Ändern sie zurück speichern und in die MP3 anfügen .... dazu dann den Server realiesieren der die XML und alle Daten kriegt und darauß eine Webseite erstellt
 
Zuletzt bearbeitet:
Zurück