# Erfahrungswerte: Welche XML Api eignet sich als Datenformat?



## Daniel_L (17. Apr 2007)

Hallo,

ich bin derzeit dabei, Java zu lernen, und möchte einige meiner Windows-only Programme nun in Java neu programmieren. Ein Programm (Zettelkasten) speichert etliche Einträge (Zettel) mit diversen Angaben pro Zettel (Inhalt, Autor, Schlagwörter...).

Nun wollte ich diese Daten, die bisher quasi als reine ASCII-/Text-Daten gespeichert werden, künftig mit einer XML-Api laden/speichern.

Die Datendatei kann unter Umständen sehr viele Einträge enthalten und daher durchaus 2-3 Megabyte groß sein, im Laufe der Zeit ggf. sogar noch größer. Welche XML  Api bietet sich da an?

Ich habe gelesen, dass JAXP die XML Datei komplett einliest und dann die Daten im Speicher behält, sodass man schnellen Zugriff auf alle Einträge hat. Das wäre vorteilhaft bei Suchabfragen, weil ich dann ja für das "Durchblättern" (Suchen) der Einträge bspw. durch eine for-next-Schleife nicht für jeden Eintrag einen neuen Festplattenzugriff auf die Datendatei benötige, weil ja alles im Speicher bleibt.

Meine Fragen: Hab ich das mit dem JAXP richtig verstanden? Welche API bietet sich da an? Gibt es ggf. andere (bessere?) Möglichkeiten, Datenmengen dieser Struktur und in diesem Umfang zu speichern? Wobei mir XML (in Kombination mit ZIP) schon sehr gut gefällt...

Vielen Dank und Gruß
Daniel


----------



## Wildcard (17. Apr 2007)

Nimm JDom, Für richtig große Dateien >100MB nicht geeignet aber am komfortabelsten.


----------



## Daniel_L (17. Apr 2007)

Danke für die Antwort. Größer als 100 MB sollten die Dateien wohl nicht werden.

Gibt es eigentlich eine brauchbare Übersicht über die verschiedenen XML APIs? Im (Online-)Buch Java-Insel macht das auf mich einen etwas konfusen Eindruck, allerdings bin ich auch noch Java-Neuling (aber C++-erfahren...).


----------



## Wildcard (17. Apr 2007)

Die großen 3 sind
SAX
StAX
JDom
Eigentlich nimmt man fast immer JDom wenn die Dateigrößen vertretbar sind und es nicht um das letzte bißchen an Performance geht.


----------



## Hilefoks (17. Apr 2007)

Meine Empfehlung: JAXB. Mit JAXB ist es sehr einfach (über Annotations) eine Java-Klasse/-Klassenhierarchie an XML zu binden. Ebenso einfach ist aber auch das erzeugen einer Klassenhierachie aus einem bestehenden XML-Schema.

MfG,
Hilefoks


----------



## Wildcard (17. Apr 2007)

Der Empfehlung kann ich mich grundsätzlich nur anschließen, aber das passt leider nicht auf jede Situation.
Hängt also davon ab wie das Programm aufgebaut ist und was der OP erreichen möchte.


----------



## Daniel_L (17. Apr 2007)

Welche Einschränkungen wären denn zu beachten?

Ich möchte diesen Zettelkasten in Java neu programmieren. Meine Vorstellung ist dabei, die Datendatei und weitere kleinere Dateien alle als XML zu speichern und zusammen als eine ZIP-Datei zu erstellen, vielleicht entfernt vergleichbar mit JAR oder ODF Dateien. Das sind ja im Grunde auch ZIP-Dateien mit mehreren Einzeldokumenten als Inhalt.


----------



## Wildcard (17. Apr 2007)

Wenn du noch nicht allzu weit in der Implementierung bist, dann wäre JaxB tatsächlich eine sehr geeignete Alternative für dich.
Schreib dir eine xsd die dein Datenformat beschreibt und lass die von JaxB deine Model Klassen generieren.
Die lassen sich dann relativ automatisch in dein XML Format speichern und laden.


----------



## Daniel_L (17. Apr 2007)

Ich bin noch nicht angefangen mit der Umsetzung, da ich mich zurzeit noch in Java und Netbeans einarbeite.

Bietet JaxB auch den Vorteil (sofern es einer ist), gleich alle Daten im Speicher zu haben?


----------



## Wildcard (17. Apr 2007)

JaxB überführt die XML Daten direkt in Datenobjekt mit denen du arbeitest (und die liegen natürlich im Speicher). 
Diese werden die Model Schicht deiner MVC Anwendung.
Das XML wird praktisch komplett abstrahiert, du rufst nur noch zum Laden den unmarshaller und zum Speichern den Marshaller auf.


----------



## Daniel_L (17. Apr 2007)

Alles klar.

Vielen Dank für die Hilfe!


----------



## Daniel_L (22. Apr 2007)

Ich hab noch mal eine Frage, die wahrscheinlich nicht nur auf diese XML Api zutrifft:

Das erzeugte Datenobjekt, kann ich darauf von all meinen "Fenstern" zugreifen?

Oder anders: Meine Anwendung(en) haben ja recht viele zusätzliche Fenster (JFrames?), teilweise modal, teilweise nicht-modal, und ich muss auf ein und dasselbe Datenobjekt aus verschiedenen Fenster zugreifen können.

Wie macht man sowas prinzipiell? Eine eigene Klasse angeben und... die "Referenz" (Pointer-ähnlich, wie bei C++) übergeben?

Und: wie wäre das bei diesem von JaxB erzeugtem Objekt?


----------



## Wildcard (22. Apr 2007)

Du brauchst natürlich eine Referenz, sonst kannst du ein Objekt nicht ansprechen.


----------



## Daniel_L (23. Apr 2007)

Und so eine Referenz kann man "Klassen übergreifend", also global erstellen? Unter C++ hätte ich einen Pointer erstellt und diesen per Parameter an andere Klassen/Forms/Frames übergeben, aber wie macht man sowas unter Java? Gibt es dazu irgendwo Anleitungen oder ähnliches?


----------



## Wildcard (23. Apr 2007)

Referenzen werden als Parameter übergeben (im Konstuktor oder einer Methode). Nach Beispielen muss man nicht lange suchen, dann ohne die Übergabe von Referenzen funktioniert in Java gar nichts.


----------



## Hilefoks (23. Apr 2007)

Wildcard hat gesagt.:
			
		

> Schreib dir eine xsd die dein Datenformat beschreibt und lass die von JaxB deine Model Klassen generieren. Die lassen sich dann relativ automatisch in dein XML Format speichern und laden.


Nur zur Ergänzung: Gerade für Anfänger und einfachere Datenstrukturen ist der umgekehrte Weg, Java-POJO an XML über Annotations mit JAXB2, oft einfacher, da hier die Einarbeitung in XML-Schema entfällt und auch keine Klassen automatisch generiert werden. Einsteiger neigen meiner Erfahrung nach dazu solche Klassen nicht zu verstehen da Sie sie nicht selbst entworfen haben.


----------



## Daniel_L (23. Apr 2007)

Wildcard hat gesagt.:
			
		

> Referenzen werden als Parameter übergeben (im Konstuktor oder einer Methode). Nach Beispielen muss man nicht lange suchen, dann ohne die Übergabe von Referenzen funktioniert in Java gar nichts.



Gut, aber ich hab dennoch eine Frage: Ich habe mein Datenobjekt, also ein Klasse, die die XML-Daten einliest und verwaltet und mit entsprechenden Methoden einzelne Einträge verändert/hinzufügt usw. Wenn ich dieses Objekt als Parameter übergebe, wird dann eine _Kopie_ erstellt oder führen Änderungen an den Daten - z.B. durch Aufruf einer Methode, die einen Eintrag ändert - auch zu Änderungen im "Original"?

Beispiel: In meiner Hauptklasse werden die Daten geladen und angezeigt. Nun habe ich ein eigenes Fenster (JFrame) für das Bearbeiten von vorhandenen Daten/Einträgen. Ich übergebe mein Datenobjekt/Datenklasse per Konstruktor an das Änderungsfenster/-klasse, dort wird bspw. mit der Methode Datenklasse.ChangeEntry() ein Eintrag geändert und das Änderungsfenster danach geschlossen. Werden diese Änderungen nun in meinem Datenobjekt übernommen?

Oder ist es sinnvoller, zu sagen: Lese aus dem Hauptfenster den Inhalt/String von Eintrag E aus, übergebe den String an das Änderungsfenster, beim Schließen lese aus dem Hauptfenster wieder die Eingaben aus dem Änderungsfenster aus und aktualisiere Eintrag E von Hauptfenster aus, das direkten Zugriff auf das Original-Datenobjekt hat?

Mich interessiert hier vor allem der Austausch von Daten zwischen verschiedenen JFrame-Objekten, sei es, dass sie modal oder nicht-modal sind.


----------



## byte (23. Apr 2007)

Hilefoks hat gesagt.:
			
		

> Nur zur Ergänzung: Gerade für Anfänger und einfachere Datenstrukturen ist der umgekehrte Weg, Java-POJO an XML über Annotations mit JAXB2, oft einfacher, da hier die Einarbeitung in XML-Schema entfällt und auch keine Klassen automatisch generiert werden. Einsteiger neigen meiner Erfahrung nach dazu solche Klassen nicht zu verstehen da Sie sie nicht selbst entworfen haben.



Nicht nur für Anfänger ist das imo der interessantere Weg. Ich finde es wesentlich sinniger, wenn ich die Objektstruktur entwerfe und daraus das XML-Schema generiert wird als umgekehrt. Gibts da eigentlich mittlerweile automatisierte Möglichkeiten? Als ich mich damals mal mit JAXB beschäftigt habe, gabs irgendwie nur die Möglichkeit, aus einem Schema die Java-Klassenstruktur abzuleiten, aber nicht umgekehrt (oder ich hatte da was übersehen).


----------



## Daniel_L (26. Apr 2007)

Keiner eine Idee? Oder war meine Beschreibung etwas konfus? ;-)



			
				Daniel_L hat gesagt.:
			
		

> Wildcard hat gesagt.:
> 
> 
> 
> ...


----------



## Wildcard (26. Apr 2007)

Wo ist denn das Problem das ganze anhand eines 10 Zeilen Beispiels auszuprobieren?
Dann verstehst du es wohl besser als wenn ich dir erkläre wie call-by-value in Java funktioniert.
Ob es sich um JFrames, modale JDialogs oder Apfelkuchen Objekte handelt ist dabei übrigens völlig irrelevant.


----------



## Daniel_L (26. Apr 2007)

Call-by-value war ja schon mal ein gutes Stichwort. Hier und auf den Folgeseiten wird das kurz beschrieben.

Nun hab ich hier wiederum gelesen, dass es auch ein call-by-reference gibt.

Wenn ich das also richtig verstanden habe, kann das Objekt "direkt bearbeitet" werden, wenn eine Variable auf ein Objekt verweist.



> Wo ist denn das Problem das ganze anhand eines 10 Zeilen Beispiels auszuprobieren?


Stimmt eigentlich, mach ich auch gleich mal. Ich hatte nur diese XML-Api vor Augen, und so weit bin ich noch nicht, dass ich die ohne weiteres verwenden könnte.


----------

