# Datenmodell mit EMF und XML



## Maddog1985 (6. Mrz 2010)

Hallo,
ich habe mir mit EMF und Eclipse ein Ecore-Modell erstellt (siehe Anhang) und danach versucht mir ein Beispiel-Datenmodell zu basteln (in einer neuen Eclipse-Instanz). Meine zugehörige XML-Datei sieht im Moment so aus:

[XML]
<?xml version="1.0" encoding="UTF-8"?>
<dataataModel xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:data="mwe.demo.emf.datamodel">
  <entity name="Person">
    <attribute name="name" type="String"/>
    <reference name="autos" toMany="true" target="//@entity.1"/>
  </entity>
  <entity name="Vehicle">
    <attribute name="plate" type="String"/>
  </entity>
</dataataModel>
[/XML]

Mein Problem ist nun folgendes: Bisher stehen die Namen der Assoziationen bzw. Kompositionen als Elemente (Tags) in der XML-Datei. Ich möchte aber nur die Klassennamen als Elemente benutzen. Wie mache ich das wohl am Besten?

Vielen Dank

Gruß,
Maddog1985


----------



## Wildcard (6. Mrz 2010)

Wenn du eine bestimmte XML Repräsentation haben möchtest ist es am einfachsten ein XML Schema zu schreiben und das Ecore aus dem Schema abzuleiten.


----------



## Maddog1985 (7. Mrz 2010)

Hi.
Danke für die Antwort. Ich möchte bald allerdings auch viel größere Datenmodelle entwickeln und dafür ist ein Ecore-Diagramm (in meinen Augen) übersichtlicher. Wieder zurück zu meinem Problem: Kann man das mit den Klassennamen nicht irgendwie in den Properties einstellen?

Kennst du vielleicht eine gute Einführung zu XML-Schema?

Gruß,
Maddog1985


----------



## Wildcard (7. Mrz 2010)

Du kannst das auch ohne Schema erreichen, dazu muss das ecore mit annotations angereichert werden um die Serialisierung zu steuern.
Genau das macht der XSD Importer automatisch für dich, händisch ist es etwas mehr arbeit.
Das Schema hat 2 Vorteile:
1. Damit hast du direkt etwas das andere XML Parser zum validieren benutzen können wenn dein Format auch mal mit einem klassischen Parser verarbeitet werden soll
2. Ein Schema macht es für andere leichter dein Format zu verarbeiten.

Ein paar Details zum XSD/Ecore Mapping:
Authoring XML Schemas for use with EMF - Eclipsepedia


----------



## Maddog1985 (7. Mrz 2010)

Danke für den Tipp mit den Ecore-Annotationen. Hast du dazu vielleicht auch noch einen Link?


----------



## Wildcard (7. Mrz 2010)

Nicht ausser dem den ich dir schon gegeben habe. Daher mein Tipp, fang einfach mal mit einem vereinfachten Schema an, importiere es und schau dir die daraus generierten Annotations im Ecore an.
Das kannst du dann auf deinen konkreten Fall übertragen.


----------



## starbugs (16. Mrz 2010)

Hallo zusammen - Ich habe ein ähnliches Problem:

Ich habe ein ecore - Metamodell erstellt und möchte auf Basis dieses Modells XML - Files erzeugen. 

Als ersten Ansatz habe ich mir ein .genmodel erzeugt, dass mir neben dem Erstellten Objektmodell auch - mit Hilfe des Properties "Generate Schema" = true - ein XSD sowie ein XSD2Ecore Model erzeugt. 

Nachdem ich eine Instanz meines Objektmodells erzeugt habe, nutze ich den java.beans.XMLEncoder zur Erstellung eines XML - Files. Dies funktioniert jedoch nicht (obwohl ich aus Serialisierungsgründen in den .genmodel - Properties: Supress GenModel Annotations = false gesetzt habe)...

Fehlermeldung : 
java.lang.IllegalAccessException: Class sun.reflect.misc.Trampoline can not access a member of class....
java.lang.Exception XMLEncoder: discarding statement XMLEncoder.writeObject(xy)

1.Frage: Ist das generell der Richtige weg aus einem ecore-Modell ein konformes XML File zu erzeugen ?
2.Frage: Wenn ja, welche Properties müssen ggf. bei der Objektmodell - Erstellung (durch genmodel) noch gesetzt werden um mit dem XML Encoder ein gültiges XML - File zu erstellen

Vielen Dank an potentielle Helfer !


----------



## Wildcard (16. Mrz 2010)

starbugs hat gesagt.:


> 1.Frage: Ist das generell der Richtige weg aus einem ecore-Modell ein konformes XML File zu erzeugen ?


Absolut gar nicht. Der EMF Weg: erzeuge eine Resource (zB XMLResource), füge deinen Inhalt ein und speichere die Resource:


```
Resource r = new XMLResource();
r.getContents().add(yourRootObject);
r.save(outputStream,null);
```
Ob es eine XMLResource, oder eine andere ist hängt von deinem konkreten Modell ab.
Generier die einfach mal den Edit und Editor, damit hast du bereits einen Eclipsebasierten Baum Editor mit dem du dein Modell anlegen, editieren, laden und speichern kannst. Den Code kannst du auch gleich als Beispiel verwenden.
Ausserdem kann dir EMF Standalone Example Code generieren. Dazu musst du den 'Test Code' aus dem Genmodel generieren.
XMLEncode hat in dieser Gleichung gar nichts verloren.


----------

