# [EMF] XMI lesen



## miketech (9. Feb 2012)

Hallo zusammen,

ich habe ein Metamodell serialisiert in XMI, wobei hier auch Elemente aus Ecore zum Einsatz kommen. Nun habe ich ein konkretes Modell, welches ebenfalls in XMI vorliegt. Wie lese ich das Modell nun basierend auf dem Metamodell XMI ein, so dass ich es mittels Java bearbeiten kann?

Wäre für ein paar Starthilfen dankbar 

Gruß

Mike


----------



## Wildcard (9. Feb 2012)

Du hast aus dem Ecore Klassen generiert? Falls ja, dann geht das über eine Resource bzgw ein ResourceSet. Am einfachsten ist es, wenn du auch den Test Code generierst, dann legt EMF eine Example Klasse an in der eine Datei geladen, manipuliert und gespeichert wird.


----------



## miketech (9. Feb 2012)

Hallo Wildcard,

danke für Deine Antwort. Gibt es denn auch einen Weg ohne die Ecore-Klassen? Oder ist das zwingend erforderlich?

Gruß

Michael


----------



## Wildcard (9. Feb 2012)

Ohne die Ecore Klassen? Das heißt also du hast keinen Quellcode generiert und hast lediglich ein ecore?
Ja, das geht auch, aber da du keine Java Klassen hast, hast du auch keine normale API mit gettern und settern. Das ganze nennt sich dann dynamic ecore. Bevor du damit anfängst, würde ich erst mal static ecore versuchen (also Klassen generieren) um EMF besser zu verstehen.

Die Reflektive API bedient sich nämlich in etwa so (Pseudocode):

```
EObject root = resource.getContents().get(0);
EClass eClass = yourEPackage.getEClass("Root");
String name = root.eGet(eClass.getEStructuralFeature("name"));
root.eSet(eClass.getEStructuralFeature("name"),name.toUpperCase());
```

Im vergleich zu:

```
Root root = resource.getContents().get(0);
root.setName(root.getName().toUpperCase());
```


----------



## miketech (9. Feb 2012)

Hallo Wildcard,

danke. Die Unterschiede verstehe ich gut, das dynamische ist auch durchaus meine bevorzugte Variante. Meine Frage ist nur: Wird dann währenddessen geprüft, dass das Modell, das ich erstelle auch konform zum zugrundeliegenden Metamodell ist? Wenn ich die statische Variante nutze, bin ich ja ohnehin auf die Klassen eingeschränkt. Aber wird das bei der dynamischen Variante auch geprüft?

Danke

Michael


----------



## Wildcard (9. Feb 2012)

Klar wird das geprüft. Bei jedem eGet, eSet, eUnset usw. musst du ja ein EStructuralFeature angeben, sonst funktioniert es nicht. Falls es dir um die definierten Constraints geht (zB upper bound = 4, OCL Constraints, oder sonstiges), dann ist die Antwort ebenfalls 'ja'. 
Dynamischem Ecore liegt das gleiche Ecore wie statischem Ecore zu Grunde. Wenn du also zB den Diagnostician verwendest um dein Modell validieren zu lassen, dann wird er anhand des dynamischen Ecores erkennen, wenn du für ein multi Feature den upper bound überschreitest und dir das gleiche Diagnostic liefern, wie wenn du Klassen generiert hättest.
Auch die Notifications haben die gleiche Mächtigkeit bei dynamischem Ecore.
Alles ist etwas langsamer, die API nicht so komfortabel und du kannst den Code nicht customizen, aber davon abgesehen ist dynamic Ecore genauso mächtig wie die static Variante.


----------

