# .xsd File wärend der Laufzeit einlesen und XMl rausschreiben



## jstei001 (28. Jun 2012)

Hallo,

ich stehe vor einer etwas komplexeren Anwendung, und zwar geht es darun anhand von einer .xsd, dazu gültige xml-Dokumente zu erzeugen, gefüllt mit Testdaten.

Das Problem ist das ganze müsste wärend der Laufzeit passieren.

Mein Grundgedanke wäre so, das .xsd auslesen und daraus die Java-Klassen erzeugen und dann mit code-reflection sich die setter geben lassen und auch benutzen, um die Testdaten einzupflegen, anschließend wird das XML an ein Servlet weitergeschickt.


Es soll ein Programm werden was ein .xsd als Input bekommt und ein Xml daraus generiert (mit Testdaten gefüllt) und weiter an ein Servlet sendet. Ich kenne JAXB, aber das Problem ist dass man da die Klassen wärend der Entwicklung erzeugt bei mir müsste das alles etwas dynamischer ablaufen. 

Ich bin für jede Hilfe dankbar.


----------



## SlaterB (28. Jun 2012)

ich glaube nicht dass du die Java-Klassen brauchst, wenn du sie eh nur kompliziert mit Reflection füllen willst 
und dafür anscheinend doch die XSD analysieren musst, also auf jeden Fall selber die Struktur durchgehst

mache den Durchgang, aber erzeuge dann gleich XML-Nodes, etwa in ein DOM-Document, oder gar direkt XML-String-Bestandteile

edit:
ok, Reflection könntest du direkt auf die Java-Klassen anwenden,
willst du also das XSD nicht selber einlesen? na mehr kann ich eh kaum beitragen


----------



## jstei001 (28. Jun 2012)

Das XSD muss ich nicht einlesen, ich muss nur eine XML erzeugen die dagegen valide ist.

Java-reflection wäre ganz cool, weil ich brauch mir nur die Setter geben lassen und kann diese nutzen zum füllen.

Selber die XML erzeugen ist schlecht da es immer unterschiedliche xsd dateien sein könnten, die auch sehr groß wären.

Ich habe jetzt einen Ansatz, ich rufe den xjc aus Java heraus auf, der generiert mir die JAXB-Klassen und auf die greife ich zu.

Nächstes Problem ist dann, ich kenne die Namen der JAXB Klassen erst zur Laufzeit und weiß nicht wie ich an die Klassen komme, weil class.forname geht ja nicht und gib mir alle Klassen in einem package leider auch nicht.


----------



## SlaterB (28. Jun 2012)

> und gib mir alle Klassen in einem package leider auch nicht. 

die Festplatte muss man selber durchsuchen


----------



## jstei001 (29. Jun 2012)

Ich habe jetzt ein Lösungsansatz der soweit geht, falls jemand noch einmal das Problem hat:

XJC Compiler kann man einfach per Runtime in Java ausführen, mit der Code Reflection sucht man nach der Klasse ObjectFactory, die von JAXB erzeugt wurde. Diese Klasse enthält alle Methoden um die einzelnen Elemente(Klassen) aus der xsd zu erzeugen, damit kann man gut arbeiten.

Einziger Haken noch: Nachdem JAXB die Java-Klassen erzeugt hat, muss die Ordner Struktur einmal Refreshed werden damit man die Klasse ObjectFactory findet. Aber auch das ist bestimmt irgendwie in Java lösbar.


----------



## jstei001 (29. Jun 2012)

Damit die Klassen gefunden werden liegt daran, dass Eclipse erst nach einem refresh kompiliert. 

Man muss dann noch einmal den java kompiler aus der Runtime aufrufen und die erzeugten .class dateien in den bin ordner vom Projekt kopieren. Dann findet man mit class.forname auch die ObjectFactory.


----------

