# xmi auslesen



## Spot84 (11. Sep 2008)

Hallo!
ich soll in ArgoUML(ein Case Tool) Modelle miteinander vergleichen, also später die Unterschiede zwischen ihnen anzeigen lassen. Diese Modelle werden im Format XMI abgelegt.
Ich hab in ArgoUML schon ein bisschen rumgeschaut und auch eine Klasse XmiReaderImpl gefunden nur leider verstehe ich nicht ganz wie man diese Klasse nutzt.  :?:

Meine Frage ist jetzt kann ich die xmi-Dateien auch ganz normal wie jede andere xml-Datei auslesen und dann vergleichen oder gibt es dabei irgendetwas zu beachten?Ich würde mir dann nämlich versuchen einen xml-Parser zu schreiben.

Vielen Dank schonmal! 
und Gruß 

Spot


----------



## foobar (11. Sep 2008)

Warum willst du selber einen Xmlparser schreiben? Es gibt doch schon genügend Xmlparser-Apis in Java (Dom, JDom, Sax, Stax, Jaxb, Emf etc.)


----------



## Spot84 (11. Sep 2008)

naja komplett neu schreiben war falsch ausgedrückt. also ich würde dann schon einen von dir genannten xml-parser verwenden. allerdings weiss ich nicht ob das ganze auch mit xmi dateien geht und ob ich dort noch etwas beachten muss.Sozusagen weiss ich nicht ob xml und xmi das selbe sind?

 ich hab ja sogar in dem sourcecode von argouml eine Klasse gefunden die ich glaube nutzen zu können.Sie heisst XmiReaderImpl  und implementiert die Schnittstellen XmiReader, UnknownElementsListener,XMIHeaderConsumer.

```
/**
 * A wrapper around the genuine XmiReader that provides public access with no
 * knowledge of actual UML implementation.
 *
 * @author Bob Tarling
 */
class XmiReaderImpl implements XmiReader, UnknownElementsListener,
        XMIHeaderConsumer {
...
}
```

Allerdings verstehe ich nicht wie man diese Klasse nutzt da sie weder public noch private ist.

Hab mir jetzt im Chat sagen lassen das sie dann protected ist und ich nur in dem selben Paket darauf zugreifen kann.. 
Aber das kann doch eigentlich nicht sein, oder? Ich meine in ArgoUML parsen sie ja auch xmi-Dateien also müsste ich das doch auch nutzen können und nicht alles neu schreiben müssen.


----------



## Wildcard (11. Sep 2008)

Damit lässt sich aus einem Argo XMI ein Ecore Modell (Eclipse Modeling Framework/EMF)erstellen mit dem du automatisch zum Diagramm passenden Quellcode erzeugen kannst.
http://argo2ecore.sourceforge.net/
Wenn du die Datei aus anderen gründen einlesen willst, würde ich dir trotzdem EMF ans Herz legen, das XMI von Hause aus versteht, oder das konkrete EMF Modell UML2.0, je nachdem was du machen möchtest...


----------



## Spot84 (12. Sep 2008)

du meinst mit der klasse wird ein emf erstellt?
ne dann brauch ich die klasse wohl doch nicht. ich will ja lediglich die xmi datei auslesen und mit einer anderen vergleichen so das ich die modellunterschiede anzeigen lassen kann.


----------



## Wildcard (12. Sep 2008)

Dann nimm einfach nur EMF und dazu dann noch EMF Compare.


----------



## Guest (16. Sep 2008)

nein das kann ich leider nicht verwenden. ich will ja modelle die mit argouml modelliert wurden und über xmi exportiert werden miteinander vergleichen und dann ein comparemodul in argouml implementieren.
Also im Prinzip das was das EMF für eclipse ist für argouml bauen.


----------



## Spot84 (16. Sep 2008)

der Text oben ist von mir. sorry, hatte vergessen mich anzumelden.  :roll:
Ich versuch jetzt erstmal die XMI-Dateien mit dem NetBeans XMI Reader zu parsen weil in der xmi-Datei steht das sie mit dem  NetBeans Xmi Writer geschrieben wurden und ich mir nicht sicher bin ob man xmi genau so parsen kann wie xml.


----------



## Wildcard (16. Sep 2008)

EMF ist von Eclipse, aber nicht ausschließlich für Eclipse. Du brauchst kein Eclipse für  EMF, oder EMF Compare und meiner Meinung nach ist es genau das richtige für dich.
EMF Compare wird dir ein Diff und ein Match Model erstellen auf dem dann dein Compare Viewer basieren kann.
XMI ist übrigens XML, jeder XML Parser kann damit also umgehen, nur verstehen wird er es nicht. Das kann EMF dann besser, weil es Dinge wie die XMI ID von Haus aus versteht.


----------



## Spot84 (18. Sep 2008)

achso, das wusste ich nicht. Ich dachte für das EMF ist Eclipse eine Vorraussetzung da auf der Webseite von EMF eine Abbildung mit der GUI von Eclipse zu sehen ist.

Großes Danke an dich Wildcard!!!   
Hast mir echt geholfen und das kann die Sache natürlich enorm vereinfachen.  

Hast du oder jemand anderes, villeicht noch ein paar Literaturtips oder Links für mich wie man das EMF einsetzt und wie man die XMI Dateien ins EMF einbinden kann?

Hab derzeit nämlich noch nicht viel, also so gut wie garnix im Netz zu dem Thema gefunden.Nur wie man das EMF Compare direkt in Eclipse anwendet aber nicht wie man es in seine eigenen Projekte integriert.

und nochmal Dankeschön!


----------



## Wildcard (18. Sep 2008)

Versuch erstmal ein neues EMF Model auf Basis der XMI.xsd anzulegen (Falls die von OMG Probleme macht, nimm einfach die, die EMF im ecore Plugin hat).
Vom EMF Modell erzeugst du dir dann Java Klassen.
Tutorials gibt es auf Eclipse genug, such einfach mal ein wenig auf der EMF Seite.

EMF Compare liefert dir wie gesagt nur ein Diff und ein Match Model. Da du keine Eclipse RCP hast, musst du deinen eigenen Compare Editor schreiben. Das macht immer noch genug Arbeit, aber EMF Compare nimmt dir einen großteil des 'Heavy Lifting' ab.


----------



## Spot84 (19. Sep 2008)

> Versuch erstmal ein neues EMF Model auf Basis der XMI.xsd anzulegen (Falls die von OMG Probleme macht, nimm einfach die, die EMF im ecore Plugin hat).
> Vom EMF Modell erzeugst du dir dann Java Klassen.



Sorry aber das verstehe ich nicht. Wieso solte ich aus der XMI.xsd ein EMF-Modell machen?Und wieso danach Klassen erstellen? Wenn wir von EMF-Modellen reden meinen wir doch immer ECoreModelle oder?

Mein Gedanken waren folgende.
Ablauf wäre: Ich starte ArgoUML, modelliere damit 2 UML-Diagramme und speichere diese jeweils als eine XMI-Datei ab. Mein Modul liest diese dann beide ein und  das EMF erstellt mir die dazugehörigen ecore-Modelle und vergleicht diese dann mittels EMF-Compare. 

Problem ist nur, das ich, mit Hilfe von EMF keine Ecore-Modelle aus einer ArgoXMI erstellen kann. Oder?
Ich könnte höchstens das von dir oben genannte Tool argo2Ecore verwenden, was so aber nicht schön wäre da ich immer auf Eclipse angewiesen bin.

Dein Ansatz mit der XMI.xsd verstehe ich hingegen garnicht. Ich habe mir z.B. das folgende Tutorial auf der Eclipseseite angeschaut. Hier wird aus einer xsd-Datei ein Ecore-Modell erzeugt.
Tutorial
Das verstehe ich, weil damit können zum Ende des Tutorials dann in einem Editor, der in Eclipse läuft,  beliebige xml-Dateien die mit dem Schema konform gehen, erstellt werden.

Aber wieso solte ich ein Schema nutzen? Meine Modelle liegen doch schon als xmi-Datei vor. Ich bräuchte sie doch nur noch wie oben beschrieben einlesen und danach vergleichen, oder nicht?

Sorry wenn ich mich ein wenig düsig anstelle aber ich kapier es wirklich nicht.. :?


----------



## Wildcard (20. Sep 2008)

Ein ecore Modell ist ein Meta-Modell. Ein Modell, das beschreibt wie dein Datenmodell aussieht. EMF verwendet Ecore Modelle um (unter anderem) Klassen zu generieren die per XML Binding auf (XML/XMI) gemappt werden können.
Du möchtest XMI Dateien einlesen, also würde ich sagen, lässt du dir von der XMI.xsd ein Ecore Modell erzeugen aus dem dir EMF Java Klassen generiert die du stand-alone verwenden kannst. Damit bist du dann in der Lage eine XMI Dateien einzulesen und in eine Objektstruktur zu überführen.
Liest du nun zwei solcher XMI Dateien ein, kannst du die entstandenen Modelle mit EMF Compare vergleichen und mit dem Diff deinen Compare Editor füttern.


----------



## Spot84 (21. Sep 2008)

aaaahhh, ok wildcard. ich glaube ich habs jetzt auch endlich kapiert. 
werd mich dann mal  ransetzen und versuchen das irgendwie hinzubekommen. 

Vielen Dank nochmal für die Mühe!    :toll:  :toll:  :toll:


----------



## Guest (22. Sep 2008)

Hallo!
ich bins mal wieder..  ^^

hab jetzt versucht über die xmi.xsd ein ecore modell zu erstellen und aus diesem dann Klassen zu generieren um so die xmi-Dateien auszulesen. Was mir mit einer beliebigen xsd datei auch bisher ohne Probleme gelang. Allerdings hab ich nun über die mailing liste von argouml rausbekommen das argouml kein schema verwendet sondern eine dtd.    

Hab jetzt versucht mit unterschiedlichen Tools wie Altova XML Spy die dtd in eine xsd zu konvertieren was aber nicht wirklich funktioniert hat da ich ständig Fehlermeldung bekomme.

Hat villeicht jemand eine andere Idee wie ich aus einer DTD ein ECoreModell erzeugen kann?


----------



## Spot84 (22. Sep 2008)

Der Text über mir ist von mir,  hab mal wieder vergessen mich anzumelden.
Ich hab übrigens auch bei der OMG geschaut aber dort war kein Schema für uml1.4 zu finden.
Eine XMI-Datei die aus ArgoUML exportiert wird sieht z.B. so aus:

```
<?xml version = '1.0' encoding = 'UTF-8' ?>
<XMI xmi.version = '1.2' xmlns:UML = 'org.omg.xmi.namespace.UML' timestamp = 'Mon Sep 22 22:38:29 CEST 2008'>
  <XMI.header>    <XMI.documentation>
      <XMI.exporter>ArgoUML (using Netbeans XMI Writer version 1.0)</XMI.exporter>
      <XMI.exporterVersion>PRE-0.26.beta2(6) revised on $Date: 2007-05-12 08:08:08 +0200 (Sa, 12 Mai 2007) $ </XMI.exporterVersion>
    </XMI.documentation>
    <XMI.metamodel xmi.name="UML" xmi.version="1.4"/></XMI.header>
  <XMI.content>
    <UML:Model xmi.id = '-64--88-0-2--4e83737c:11c8bc7a074:-8000:0000000000000B06'
      name = 'untitledModel' isSpecification = 'false' isRoot = 'false' isLeaf = 'false'
      isAbstract = 'false'>
      <UML:Namespace.ownedElement>
        <UML:Package xmi.id = '-64--88-0-2--4e83737c:11c8bc7a074:-8000:0000000000000B07'
          name = 'TestPaket1' isSpecification = 'false' isRoot = 'false' isLeaf = 'false'
          isAbstract = 'false'/>
        <UML:Class xmi.id = '-64--88-0-2--4e83737c:11c8bc7a074:-8000:0000000000000B08'
          name = 'Testklasse1' visibility = 'public' isSpecification = 'false' isRoot = 'false'
          isLeaf = 'false' isAbstract = 'false' isActive = 'false'/>
      </UML:Namespace.ownedElement>
    </UML:Model>
  </XMI.content>
</XMI>
```


----------



## Wildcard (22. Sep 2008)

Der einzige Namespace ist anscheinend org.omg.xmi.namespace.UML. Versuch doch mal das fertige UML2 EMF Modell von Eclipse. Vielleicht kannst du es damit schon einlesen.
http://www.eclipse.org/modeling/mdt/?project=uml2


----------



## Spot84 (23. Sep 2008)

hab das jetzt mit dem UML2 EMF Modell von Eclipse probiert aber ich bin mir nicht ganz sicher wie genau man das einsetzen muss, daher beschreib ich mal was ich ausprobiert habe.
Als erstes muss ich aber leider sagen das beides nicht funktioniert hat.

1.)ich bin wie in diesem  Tutorial vorgegangen. Hier wurde aus Visual Paradigm heraus eine XMI exportiert und mit dem UML Modell Editor in Eclipse geöffnet.
Tutorial

Also:
-Neues Projekt erstellt 
-die xmi ins Projekt importiert 
-versucht sie mit dem UML Editor zu öffnen
--> daraufhin bekam ich folgende Fehler(hab nicht alle aufgelistet) ausgegeben



> org.eclipse.emf.ecore.resource.impl.ResourceSetImpl$1DiagnosticWrappedException: org.eclipse.emf.ecore.xmi.PackageNotFoundException: Package with uri 'null' not found. (platform:/resource/uml2/rene1.xmi, 3, 15)
> at org.eclipse.emf.ecore.resource.impl.ResourceSetImpl.handleDemandLoadException(ResourceSetImpl.java:315)
> at org.eclipse.emf.ecore.resource.impl.ResourceSetImpl.demandLoadHelper(ResourceSetImpl.java:274)
> at org.eclipse.emf.ecore.resource.impl.ResourceSetImpl.getResource(ResourceSetImpl.java:397)
> ...



2.)Ich bin wie zuvor mit der xmi.xsd vorgegangen.Also wie in diesem Tutorial beschrieben. EMF Model using XML Schema (XSD). Nur das ich hier anstatt der Auswahl einer Schema Datei, die Auswahl UML Modell genommen habe.

Also:
-Neues EMF-Projekt erstellt
-uml modell ausgewählt und
-die test.xmi von vorhin als Modell URI ausgewählt.

--> daraufhin bekam ich folgende Fehler(hab nicht alle aufgelistet) ausgegeben



> org.eclipse.emf.ecore.xmi.PackageNotFoundException: Package with uri 'null' not found. (file:/C:/Dokumente%20und%20Einstellungen/normal/Desktop/rene1.xmi, 3, 15)
> at org.eclipse.emf.ecore.xmi.impl.XMLHandler.createObjectByType(XMLHandler.java:1293)
> at org.eclipse.emf.ecore.xmi.impl.XMLHandler.createTopObject(XMLHandler.java:1454)
> at org.eclipse.emf.ecore.xmi.impl.XMLHandler.processElement(XMLHandler.java:1019)
> ...



Was mir bei beiden Ansätzen nicht klar ist, ist das dass ganze später ja ohne Eclipse lauffähig sein soll, aber beide Ansätze Eclipse benötigen.Hab ich evtl. etwas falsch gemacht oder ist es auch mit dem UML2 EMF Modell nicht möglich die xmis einzulesen?


----------



## Wildcard (23. Sep 2008)

Nein, du brauchst dafür später kein Eclipse, es ging nur darum herauszufinden, ob die von Argo erstellte Datei schon direkt kompatibel zum UML2 Modell ist, oder nicht. Sie ist es anscheinend nicht, also würde ich entweder die DTD händisch in eine XSD umwandeln, oder hoffen, das Argo2Ecore die Arbeit schon erledigt hat. Dazu solltest du dir den Quellcode ansehen.
Nach einem kurzen Blick würde ich sagen das Tool verwendet den javax.jmi.xmi.XmiReader (anscheinend von Netbeans) und konvertiert dann in Ecore.
Da du ja nicht zwangsläufig ein EMF Modell benötigst, kannst du den Reader wohl auch direkt verwenden.


----------



## Guest (23. Sep 2008)

> Sie ist es anscheinend nicht, also würde ich entweder die DTD händisch in eine XSD umwandeln, oder hoffen, das Argo2Ecore die Arbeit schon erledigt hat. Dazu solltest du dir den Quellcode ansehen.



Das ist natürlich Mist..:?
Naja die DTD händisch umschreiben trau ich mir nicht wirklich zu, weil ich da doch relativ wenig Erfahrung damit habe. Werd mir dann wohl mal den Quellcode von Argo2Ecore ansehen.



> Nach einem kurzen Blick würde ich sagen das Tool verwendet den javax.jmi.xmi.XmiReader (anscheinend von Netbeans) und konvertiert dann in Ecore.
> Da du ja nicht zwangsläufig ein EMF Modell benötigst, kannst du den Reader wohl auch direkt verwenden.



Ich muss sagen ich hätte jetzt schon ganz gern mit EMF gearbeitet weil es ja schon dieses EMF-Compare Plugin gibt und mir das viel Arbeit abgenommen hätte.
Aber ich schau mir das mal an und werd auch mal in der mailing Liste von ArgoUML nachfragen ob evtl. dort jemand villeicht ne xsd hat.

Wildcard auf jeden Fall erstmal wieder Vielen Dank!  Wär wohl ohne dich hier aufgeschmissen  :wink:


----------



## Wildcard (24. Sep 2008)

Wenn du Probleme mit der XSD hast kannst du auch mit dem Ecore Editor ein Datenmodell erstellen. Du musst dann nur die vorhandenen Elemente identifizieren und entsprechende EClasses erstellen. Die Konvertierung schaust du dir dann bei Argo2Ecore ab. Das ist wirklich nicht viel Code, das sollte lösbar sein.


----------

