# XML -> Treeviewer: JAXB oder JDOM?



## TLang (29. Dezember 2007)

Hallo,

ich bin gerade erst auf diese Seite gestoßen, aber hier scheinen ja einige unterwegs zu sein, die sich auskennen. Vielleicht könnt ihr mir ja bei meinem Problem helfen.

Ich möchte in einem Treeviewer XML-Daten darstellen. Allerdings nicht nur aus einer Datei, sondern mehrere (~50) gleichzeitig. D.h. in dem Tree sollen die einzelnen Dateien dargestellt und jeweils aufklappbar sein. Alle XML-Dateien basieren auf einem Schema.

Idealerweise würde ich gerne ganz oben eine künstliche Zwischenebene im Baum einzuführen, um eine Gruppierung zu ermöglichen. (Also z.B. wenn ich lauter XML-Dateien habe, die ein Auto beschreiben (gemäß auto.xsd), eine Zwischenebene zur Sortierung nach Typ, etwa mit den Treenodes "Cabrio", "Kombi", "Coupe" usw.)

Nun habe ich bisher noch relativ wenig Erfahrung mit Java/XML und bei der Suche nach den Möglichkeiten bin ich u.a. auf JDOM und JAXB gestoßen, ich bin mir aber nicht sicher, welches für meine Zwecke besser ist.

JAXB scheint sehr komfortabel zu sein mit dem automatischen Generieren der Klassen. Kann ich die erzeugte Datenstruktur auch in eine eigene einbinden? Ich muss dem Treeviewer ja irgendwas als Input übergeben, also stelle ich mir das so vor, dass ich ihm ein Root-Objekt übergebe, das als children die "künstlichen" Objekte "Cabrio", "Kombi", "Coupe" usw. hat und die dann wiederum als children die von JAXB erzeugte Struktur zugeordnet bekommen. Geht das so? (Ich hoffe ihr versteht was ich meine)

Wie würdet ihr das machen?

Sorry, falls ich mich etwas unklar ausdrücke. Bin wie gesagt (bisher) nicht so der Programmiercrack
thx


----------



## Oliver Gierke (29. Dezember 2007)

JAXB tut folgendes:

Es generiert aus einem Schema annotierte Javadateien (somit ist Java 5 mindestvorraussetzung) und ermöglicht es somit ein XML File in einen Objektbaum der generierten Klassen zu marshallen bzw. zu unmarshallen. Dafür finden sich hier im Forum auch einige Beispiele.

Ich hab in einigen Projekten allerdings die Erfahrung gemacht, dass sich einige Sachen recht schwierig abbilden lassen, bzw. von dem generator nicht sonderlich schön generiert werden, so dass wir die annotationen zum Teil von hand nachziehen mussten, was dann den Hauptvorteil von JAXB (Schemaänderung -> Klassen einfach neu generieren) wegwirft. Desweiteren ist es nicht wirklich gut möglich, die generierten Klassen zu erweitern. Klar kann man von ihnen ableiten, allerdings liefern die generierten Klassen über ihre getter nur wieder generierte Klassen zurück, so dass das Traversieren über Properties nicht wirklich einfach ist. Ein weiterer Nachteil ist meiner Meinung nach, dass dadurch Domänenklassen an die Technologie gebunden werden. Nich schön IMHO. Ich weiß gar nicht mehr, ob es wenigstens möglich ist, den Generator so zu konfigurieren, dass die generierten Klassen Interfaces implementieren. Das würde das Problem etwas abmildern. JAXB ist ein Standard.

Als Alternative steht eigentlich Castor auf dem Plan. Castor arbeitet mit einem Mapping File mit dem man das XML auf belibige Klassen mappen kann. Das hat den Vorteil, dass die Domänenklassen gar nichts von irgendwelchem XML Mapping wissen und man sie so technologiefrei hält. Desweiteren ist das Mapping wesentlich flexibler als das von JAXB, so dass man nicht genötigt ist, u.U. das Design gegen die XML Strukur zu opfern. Castor geht ohne Annotationen, daher tun auch Versionenen < Java 5. Nachteile sind natürlich der zusätzliche Pflegeaufwand des zusätzlichen XML Files. Castor ist ein OpenSource Produkt - ergo kein Standard.

Fazit:
Ich bevorzuge es, mir beim Klassendesign keine Restriktionen von einer Technologie auferlegen zu lassen, da man mit XML Mapping meist Domänenklassen mappt und ein Großteil des restlichen Codes davon abhängt. Daher würde ich immer von den zu modellierenden Klassen ausgehen und schauen, in wie weit die sich mit der jeweiligen Mappingtechnologie vertragen. Kannst du die Klassen so wie du sie haben willst leicht aus dem XML erzeugen und musst sie nicht groß anpassen, ist JAXB in Ordnung. Baust du ein "Rich domain model", ist die Struktur etwas komplexer, würde ich zu Castor greifen.

Es ist ein wenig auch der Konflikt zwischen Entwickler und Projekmanagement. Der Entwickler schreibt (hoffentlich) gern schönen Code, ist flexibel beim Programmieren und landet somit eher bei Castor. Der Projektmanager sieht vor allem eins: man kann Code generieren, man hat einen Standard - und landet eher bei JAXB.

Gruß
Ollie


----------



## TLang (29. Dezember 2007)

Hm,

danke für deine ausführliche Antwort. Java 5 verwende ich, insofern also kein Problem mit JAXB. Was ich bei JAXB noch nicht verstehe ist, wie ich einen Treeviewer dann mit dem erzeugten JAXB-Objektbaum füttere.

Ich habe mal ein JFace-Treeviewer-Beispiel nachprogrammiert, das ich im Internet gefunden habe, das war ein einfacher File-Browser. Im TreeContentProvider waren die hasChildren() und die getChildren() mit Hilfe der java.io-Methoden isDirectory(), listFiles() usw. ohne Probleme zu realisieren.

Wie navigiere ich aber jetzt durch den JAXB-Objektbaum? Oder anders gefragt, wie sieht der Content-Provider in diesem Fall aus? Wäre toll, wenn da jemand ein Beispiel posten könnte.

Danke für den Hinweis zu Castor. Kannte ich noch nicht, ich werd es mir mal ansehen. Allerdings würde ich die Codegenerierung von JAXB schon gerne nutzen und das Standard-Argument zählt für mich auch. Insofern wäre mir momentan JAXB lieber.


----------



## Oliver Gierke (29. Dezember 2007)

Okay... dann das ganze also mit JAXB. Was du dann noch brauchst, ist wohl eine Art Adapter der dann Teile deines Objektbaumes entsprechen zurückgibt. Das ist dann eher eine Frage des Klassendesigns, nicht eine Frage von JAXB. Du hast nach dem Unmarshallen durch JAXB eine Instanz der Klasse des Rootelements deines XML Dokuments und kannst nach Belieben auf die Daten des Baumes zurückgreifen. getChildren() sollte dann halt genau die Objekte der Kindelemente des Rootelementes zurückgeben, was auch immer das in deinem konkreten Fall dann ist 

Für Details müsste man glaube ich mehr erfahren 

REINHAUN!


----------



## TLang (3. Januar 2008)

Hi,

nochmals Danke für deine Hilfe. Du hast natürlich recht, im Prinzip kommt es dann auf die getchildren-Methode an, die die logisch richtigen Elemente zurückliefern muss. Bis dahin hat auch alles funktioniert, also Klassen erzeugen, Unmarshallen usw., aber letzten Endes bin ich nun nach einigen Tagen Irrfahrt im JAXB-Dschungel doch bei JDOM gelandet und komme damit bisher ziemlich gut zurecht.

Insgesamt fand ich es bei JAXB auch etwas ärgerlich, dass sich viele der Tutorials noch auf 1.x beziehen oder auch gar nicht klar ist, mit welcher Version gearbeitet wird. Z.B. verwendet das "offizielle" Sun-Tutorial (http://java.sun.com/developer/technicalArticles/WebServices/jaxb/) glaube ich auch noch 1.x. Zumindest gibt es da noch die Impl-Klassen. Zu JDOM finden sich dagegen einfach Unmengen Infos im Netz.

Also thx nochmal


----------

