Objektstruktur aus XML-Datei erzeugen

Status
Nicht offen für weitere Antworten.

JanHH

Top Contributor
Hallo,

die Frage mag jetzt etwas anfängerhaft erscheinen, trotzdem stelle ich sie. Für ein Softwareprojekt, welches eine gewisse Programmierbarkeit der Anwendung erfordert, scheint es mir die einfachste Lösung, eine interne Objektstruktur (bzw. eigentlich sogar Dokumentstruktur) aus einer XML-Datei zu erzeugen. Gibt es dafür irgendwelche automatischen Verfahren, oder sollte man einen SAX-basierten XML-Parser nehmen, der mit den entsprechenden callback-Funktionen, die Funktionen meiner Objekte, die das dann "per Hand" zusammenbauen, den Kram zusammenbaut? Oder was fällt euch da spontan zu ein?

Es handelt sich da um ein nebenbei-Hobbyprojekt, welches aber, wenn es gut wird, durchaus eine grosse Zukunft haben könnte. Daher suche ich eine Lösung, die mit möglichst wenig aufwand möglichst viel automatisch macht (wobei - sowas such wir Programmierer ja immer ;) ).

Gruß+Danke
Jan
 

Wildcard

Top Contributor
Nun, dann ist meiner Meinung nach EMF das richtige für dich. Wenn du ein Schema zu deiner XML hast erzeugt dir EMF ein extrem leistungsfähiges Modell inklusive XML Binding und vieler extras.
Es gibt auch eine Sparvariante von XML Binding, das wäre dann zB JaxB. Damit bekommst du ein XML Binding und ein Java Modell (das allerdings aus nichts weiter als dummen Datencontainern besteht).
Also mein Tipp ist definitiv EMF, da es dir in praktisch jedem Software Projekt viel Arbeit abnehmen kann, selbst wenn kein XML im spiel ist. Eine gewisse Einstiegshürde musst du allerdings meistern...
 

JanHH

Top Contributor
Klingt auf jeden Fall beides interessant, wobei das JaxB-Ding schon ausreichend sein dürfte.

Generell soll das Projekt so aufgebaut sein, dass möglichst viele Standard-Frameworks und -tools benutzt werden können (also auf jeden Fall JSF, Seam, JPA), und XML für die Dokumentstruktur kommt mir da wie eine gute Ergänzung vor. Vermutlich gibt es jede Menge Tools, die einem viel abnehmen, wenn man einmal ein XML-Schema für die Dokumentstruktur entwickelt hat? Also auch visuelle Editoren, mit denen man die XML-Dokumenten auf Basis dieses Schemas "zusammenklicken" kann? Wie gesagt, bin ziemlich unerfahren mit dem Thema, daher die Fragen.
 

Wildcard

Top Contributor
Aus EMF Modellen lassen sich sehr unterschiedliche Dinge vollautomatisch erzeugen. grafische (Diagramm) Editoren, Baum Editoren, textuelle Editoren,... (die sind allerdings Eclipse RCP basiert)
Wie gesagt, schau es dir vielleicht einfach mal an. In EMF Modelle kannst du Business Logik unterbringen (die ein gutes Modell haben sollte), validieren, queries, hast eine tolle Observer Schnittstelle. Ausserdem gibt es Bindungs zu anderen Persistenzschichten wie zB Hibernate, du kannst dir Unit Test automatisch generieren lassen, hast Databinding Support für die UI, automatischen Undo/Redo Support, Transaktionssupport,...
Ich halte EMF schon alleine deshalb für den besseren Ansatz, weil sich das Modell selbst konsistent hält.
JaxB sind wirklich nur Java Klassen mit gettern und settern, ohne jede Logik oder komfort.
Aber naja, du musst selbst entscheiden was für dich das richtige ist.
 

JanHH

Top Contributor
Hab JAXB mal überflogen, und dazu gleich eine Frage:

Kann ich die XML-Datei mit JAXB nur auf die vom Schema Compiler generierten Klassen mappen lassen, sondern auch auf eigene? Die default-Klassen sind ja eher inhaltsleer, ich will natürlich, dass aus der XML-Datei ein "richtiges" Dokument mit der geforderten Funktionalität erzeugt wird. Wenn das geht, dann hab ich ja eigentlich das, was ich brauche..

Aber jetzt erstmal ein Blick auf EMF.
 
Zuletzt bearbeitet:

Wildcard

Top Contributor
Richtig, es wird auf die generierten Klassen gemappt, die, wie du ja bemerkt hast, recht leer sind (nur getter und setter).
Mit EMF mappst du zwar auch auf generierte Klassen, kannst allerdings beliebig Methoden hinzufügen und automatisch generierten Code mit händischem Code mischen.
 

JanHH

Top Contributor
Danke auf jeden Fall für den EMF-Tipp, das scheint wirklich das perfekte zu sein für das, was ich machen will. Ich fand die Einstiegshürde auch nicht so wahnsinnig hoch, ein paar Stunden Tutorials lesen und basteln, und dann geht schon einiges.

Eine Frage allerdings ist wichtig: In meiner Applikation sind eine Menge Baumstrukturen vorhanden, deren Knoten (composite-pattern) jeweils Unterklassen einer abstrakten Knotenklasse sind. Das ist ja eigentlich nichts besonders exotisches, trotzdem noch mal ein Beispiel: Ein Knoten ist entweder ein Objekt der Klasse ListenKnoten (welcher eine Liste weiterer Unterknoten darstellt) oder ein FinalerKnoten (welcher ein tatsächliches Datenobjekt darsatellt). Die gemeinsame Oberklasse von beiden sei AbstrakterKnoten. Also wie im Windows Explorer, jeder Knoten ist ja ein Verzeichnis (ListenKnoten) oder eine Datei (FinalerKnoten).

Ich nehme an, EMF eignet sich auch für sowas? Mir ist bisher nur nicht ganz klar, wie, bzw wie man das per xml-Tags realisieren soll, wenn ein Tag 1:1 auf eine Klasse gemappt wird. Als abstraktes Beispiel könnte ich mir das so vorstellen, es gibt einen Knoten-Tag, und ein type-Attribut, welcher die Art angibt:
Java:
<AbstrakterKnoten type="liste"
   <AbstrakterKnoten type="final">
      .. irgendwelche Daten
   </AbstrakterKnoten>
   <AbstrakterKnoten type="final">
      .. irgendwelche Daten
   </AbstrakterKnoten>
   <AbstrakterKnoten type="final">
      .. irgendwelche Daten
   </AbstrakterKnoten>
   <AbstrakterKnoten type="final">
      .. irgendwelche Daten
   </AbstrakterKnoten>
</AbstrakterKnoten>

Also, geht sowas? Kann mir allerdings kaum vorstellen dass es nicht geht, weil sowas ja nun eine absolute Standardstruktur in Datenmodellen ist..
 

Wildcard

Top Contributor
Die XML Serialisierung ist weitgehend über eAnnotations im Modell steuerbar. Interessanter ist an der Stelle eher das Modell selbst. Vererbung und auch Mehrfachvererbung sind möglich und damit ist dein Use-Case ja eigentlich abgedeckt.
Da du anscheindend eine spezielle XML Syntax im Sinn hast, würde ich empfehlen ein entsprechendes Schema zu bauen und dann aus dem Schema das Ecore erzeugen zu lassen.
Vererbung würde beispielsweise durch eine Substitution Group ausgedrückt werden.
 

JanHH

Top Contributor
Eine spezielle XML-Syntax war nur eine Idee, keine Notwendigkeit. Wichtig ist eigentlich nur, dass es schnell und effizient geht. Ein Dokument mit dem automatisch erzeugten Editor zu erzeugen ist für den Anfang ausreichend. Für das Erstellen des Modells scheint mir die Variante mit den annotierten Interfaces am einfachsten, ausserdem kann ich das schon und muss mich da nicht auch noch extra einarbeiten (was bei XML-Schemata der Fall wäre) :D. Die nächste Hürde, die es zu überwinden gilt, ist das Einbinden des EMF-Modells in ein JEE-Seam-Projekt, weil das ganze ja eine Webapplikation werden soll. Aber vermutlich kann man EMF in andere Umgebungen einbiden, weils ja sonst eigentlich eher sinnlos wäre !?
 

Wildcard

Top Contributor
Am einfachsten finde ich eigentlich den EMF Ecore Editor (ist ein mit EMF erzeugter Baumeditor um Ecore Dateien direkt zu erstellen). Damit musst du dann keinen Code schreiben. Aber Java Interfaces funktioniert natürlich auch.
Klar, EMF kannst du standalone verwenden, du brauchst nur ein paar Eclipse jars (die sind auch in der EMF Hilfe angegeben wenn ich mich nicht irre).
 

JanHH

Top Contributor
Eine weitere Frage stellt sich ein.. Wenn man also das EMF-Model erfolgreich erzeugt hat, einen rudimentären Eclipse-Editor dafür, und mit diesem dann ein konkretes Modell erstellt, welches als XML-Datei gespeichert wird.. und dieses dann in seiner stand alone-Application laden will. Dafür gibts dann z.B. in Tutorials den Code

Java:
URI fileURI = URI.createFileURI(new File("mylibrary.xmi").getAbsolutePath());
Resource resource = resourceSet.getResource(fileURI, true);

Nun kenne ich mich aber weder mit URIs besonders gut aus, noch habe ich den XML-Code in meiner Applikation als Datei vorliegen, sondern in einem String, welcher per JPA aus einer Datenbank geladen wird. Da das ganze innerhalb eines Application Servers laufen soll, sind Dateien auch definitiv keine Lösung, die brauchbare wäre.

Wie geht denn sowas? Sofern das überhaupt geht? Wobei ich mir eigentlich nicht vorstellen kann, das es nicht geht?
 

Wildcard

Top Contributor
Ist ganz einfach. Du erzeugst eine URI die deine Resource irgendwie identifiziert (irgendeine, die muss nirgends hinzeigen, das dient nur als Identifier). Dann Rufst du auf dieser Resource.load mit einem InputStream aus. Fertig. Damit die richtige Resource Factory verwendet wird, sollte die URI zu der Dateiendung passen die du am ResourceSet registriert hast.
 

JanHH

Top Contributor
Danke für die Antwort, immerhin gut zu wissen dass es einfach geht. Allerdings kann ich nicht viel damit anfangen ohne mich da vorher erstmal eingearbeitet zu haben. Aber klingt ja grundsätzlich nicht so kompliziert.
 

Wildcard

Top Contributor
Viele Wege führen nach Rom, das ist einer davon:
Java:
//registriert all file endings auf deine resource factory
Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("*", new
YourGeneratedResourceFactory());
//Resources leben normalerweise in einem ResourceSet, ist aber kein requirement
ResourceSet resourceSet = new ResourceSetImpl();
URI uri = new URI("doesn't/really/matter/only/an/ID/in/your/case");
//deine factory ist auf alle file (URI) endings registriert, also wird EMF deine Factory verwenden um die richtige Resource zu erzeugen
//diese Resource ist noch leer
Resource resource = resourceSet.createResource(uri);
//Deine generierte XText Resource weiß automatisch wie sie sich aus der textuellen Repräsentation laden kann
resource.load(yourInputStream, Collections.EMPTY_MAP);
YourModel model = (YourModel)resource.getContents().get(0);
 

JanHH

Top Contributor
Ich komme halbwegs voran, aber was mir unklar ist.. in dem Codebeispiel... was genau ist "YourGeneratedResourceFactory"?

Also angenommen mein EMF-Projekt heisst ABC.. dann habe ich dort generiert bekommen: Ein Interface ABCFactory, und eine Klasse ABCFactoryImpl. Wenn ich aber letztgetnannte verwendet an dieser Stelle, kommt ein Fehler:

java.lang.ClassCastException: ABC.impl.ABCFactoryImpl cannot be cast to org.eclipse.emf.ecore.resource.Resource$Factory

Bin nun wieder ratlos.
 

Wildcard

Top Contributor
Wurde dir keine ABCResourceFactoryImpl generiert? Ich habe gerade kein Beispielprojekt zur Hand. Es geht auch anders, müsste ich allerdings erst nachschlagen. Du kannst aber einfach das Interface selbst in einer Klasse implementieren AFAIR musst du nur eine createResource(URI) Methode implementieren und dort dann einfach deine ABCResource instanzieren.
 

JanHH

Top Contributor
Es gibt nur eine Stelle im eclipse-Projekt, wo der Suchstring *ResourceFactoryImpl* auftaucht, und das ist im test-Package:

resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put
(Resource.Factory.Registry.DEFAULT_EXTENSION,
new XMIResourceFactoryImpl());

Aber ich hab ja jetzt auch das EMF-Buch, das wird schon.. zumindest hat EMF einen Fan mehr. Danke nochmal für den Hinweis.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Tags in XML Datei mit Java erstellen XML & JSON 3
S XML Datei speichern nicht möglich XML & JSON 13
M Objekt zu jsonArray in .json datei hinzufügen ? XML & JSON 3
J Object in JSON Datei einlesen und als neues Object erzeugen (in ein Object Array) XML & JSON 29
I Mit Hibernate eine XML-Datei in eine Tabellenspalte einlesen. XML & JSON 1
MiMa Buch Metadaten aus XML Datei parsen XML & JSON 48
J Auslesen der Länge einer XML-Datei in Android Studio XML & JSON 8
R xlsx-Datei mit Apache POI einlesen XML & JSON 18
S Validierung einer XML-Datei - Führende Leerzeichen und Tabs XML & JSON 10
S CSV Datei einlesen und XML Ausgeben XML & JSON 2
U jar Datei mit ant erstellen XML & JSON 1
P wie kriege ich eine *.dtd Datei mit in die ausführbare *.jar? XML & JSON 2
K XML Datei erstellen und Daten daraus in Java auslesen XML & JSON 6
D XML-Datei per Button erstellen XML & JSON 3
K JAR-File mit XML-Datei XML & JSON 1
M Text eines Elements in XML Datei mit JAVA bearbeiten und kompletten Element-Zweig hinzufügen XML & JSON 16
I Liste in YAML Datei speichern und wieder auslesen XML & JSON 1
A Leeres Array beim Auslesen von XML-Datei XML & JSON 4
E JTreedaten in eine XML Datei speichern XML & JSON 3
D Int-Werte in XML-Datei schreiben (DOM) XML & JSON 2
B xsd-Datei ins jar file XML & JSON 5
T Formulardaten in XML Datei speichern XML & JSON 5
H Wsdl datei XML & JSON 2
D Große XML-Datei in einzel Dateien splitten XML & JSON 3
S Neue Inhalte in XML-Datei einfügen XML & JSON 0
S JDOM XML Datei darstellen Fehler! XML & JSON 2
S Xml File für den Aufbau einer anderen Xml Datei XML & JSON 6
M XML-Datei mit JAXB und 2 Namespaces XML & JSON 0
J XML - Datei wird nicht ganz angezeigt XML & JSON 2
P (Eclipse)Ant Script, .jar Datei erstellen mit MANIFEST.MF XML & JSON 12
Z XML Datei mit JDOM einlesen und verarbeiten XML & JSON 6
K Beim Parsen einer XML-Datei Connection timed out XML & JSON 4
E ResultSet als XML Datei speichern XML & JSON 7
M XStream, CSV Datei XML & JSON 9
A Frage zu bestehender XML Datei XML & JSON 6
A Simple Constructor Injection Datei-Pfad XML & JSON 6
K Einlesen eines Parameters aus HTML-Datei XML & JSON 4
Maxim6394 Lesen/Schreiben von XML Datei XML & JSON 9
A XML datei lesbar speichern (eingerückt) XML & JSON 7
M XML Datei Parsen XML & JSON 4
Airwolf89 HTML Datei mit SAXBuilder laden hängt sich auf XML & JSON 4
N Java Code aus XML Datei generieren XML & JSON 8
D Aus lesen einer XML-Datei ( 1 root, 3 childs) XML & JSON 7
D Wie XML Datei einlesen und HTML entities übernehmen? XML & JSON 3
R XLM Datei lesen Ändern (kompliziertes Search and Replace) und Speichern XML & JSON 12
K Kurze XML Datei Parsen XML & JSON 5
S XSD-Datei zulässige Werte auslesen XML & JSON 3
M XML Datei heapspace erreicht XML & JSON 3
M Große Datei auslesen/in dieser suchen XML & JSON 2
S Konforme XML Datei über XSD erstellen XML & JSON 2
M RSS-Datei auslesen von Yahoo Webservice XML & JSON 4
T Inhalt einer .xml Datei auf Javaoberfläche wiedergeben XML & JSON 4
M XML Datei drucken XML & JSON 8
T Daten aus Programm in XML Datei speichern XML & JSON 2
D XSD Datei erstellen XML & JSON 4
L [SAX] Geschachtelte XML Datei parsen XML & JSON 3
E XML Datei mit DOM auslesen (Text mit Attributen) XML & JSON 2
G txt. Datei in xml datei konvertieren XML & JSON 21
K XML Datei in ein Java package „einbinden" XML & JSON 3
L Reihenfolge beim xml Datei parsen einhalten? XML & JSON 8
L xml Datei parsen ohne End-Tag XML & JSON 6
C if-Abfrage mit Datei Variable aus XML-Datei XML & JSON 2
sylo Beim Erzeugen einer XML Datei auch die XML Struktur erzeugen? XML & JSON 11
sylo DOM Document in XML Datei schreiben XML & JSON 5
F XML Datei in Java einlesen XML & JSON 4
D ID's aus XML Datei rauslesen und in Java ausgeben XML & JSON 7
E XML Datei einlesen und Elemente in der Console ausgeben XML & JSON 6
N value Wert einer XML Datei mit JAVA bearbeiten XML & JSON 21
ARadauer Aus XML Datei Objekte erstellen... XML & JSON 3
N MalformedByteSequenceException bei Lesen aus XML Datei XML & JSON 2
H xml-Datei mit Attributen einlesen XML & JSON 3
A XML-Datei: Ab wann kritische Größe erreicht? XML & JSON 4
multiholle XML Datei elegant verarbeiten XML & JSON 14
M XMI-Datei auslesen XML & JSON 4
T Ließt keine XML Datei XML & JSON 2
R JAXB: Aus einem Vector oder List XML Datei erstellen XML & JSON 1
J XML-Datei ein Array einlesen XML & JSON 10
M xml - datei erstellen XML & JSON 2
T Wie einen String(XML Inhalt) in eine XML Datei speichern? XML & JSON 8
P Große XML Datei mittels JDOM bearbeiten / einlesen XML & JSON 6
H XML-Datei in einzelne XML-Dateien zerlegen XML & JSON 2
G Tags oder Zeilen der Not-Validen XML-Datei XML & JSON 7
C Suche in XML-Datei XML & JSON 6
D Zeilennummer in der XML - Datei XML & JSON 5
S Einlesen einer xml Datei XML & JSON 4
M Datei parsen XML & JSON 5
S PDF Erzeugung - Probleme mit der XML Datei bei Schema-Infos XML & JSON 2
S XML Datei einlesen, aber root überspringen XML & JSON 2
T Werte in XML Datei an entsprechender Stelle einfügen XML & JSON 3
Saxony unbekannte XML Datei parsen und ausgeben XML & JSON 10
L XML Datei in Java angeben Pfad? XML & JSON 3
A Mehrere Anwender sollen auf eine XML-Datei zugreifen XML & JSON 4
A SVG Datei auslesen und Batik XML & JSON 1
N neue XML-Datei erstellen mit vorhandener Struktur XML & JSON 18
D XML Datei innerhalb einer JAR Datei parsen XML & JSON 2
M brauche große XML-Datei für XPath-Tests XML & JSON 4
L mit Java eine HTML-Datei erstellen XML & JSON 3
L bz2-Datei parsen XML & JSON 9
A xml-schema aus wsdl auslagern in eine eigene xsd-Datei XML & JSON 3
S objekte in xml datei packen (JAXB) XML & JSON 5

Ähnliche Java Themen

Neue Themen


Oben