使用 EMF 加载多个 xmi 文件

Loading multiple xmi files with EMF

我已经使用 EMF 三个星期了。 我已经使用 运行 Eclipse 应用程序创建了我的元模型和一个实例。现在我的问题是我有多个由 Eclipse 的 运行 实例保存的 XMI 文件,我想解析它们以创建另一个文本文件来处理 xmi 文件中的数据。 为此,我使用了 EMF 的 XMIResource API,当我加载一个没有交叉引用其他 xmi 文档的文件时,一切顺利。但是,当我加载一个带有对其他 xmi 文档的交叉引用的 xmi 文档时,所有交叉引用都没有正确保存在我的 Java 模型中。

我使用这段代码来加载 xmi 文件:

XMIResource resourceInTy = new XMIResourceImpl(URI.createURI("file:/runtime-New_configuration/ApplicationInstance/instancesTypes.model"));
    resourceInTy.load(null);
    Environment env1 = (Environment) resourceInTy.getContents().get(0);

    XMIResource resourceContRel = new XMIResourceImpl(URI.createURI("file:/runtime-New_configuration/ApplicationInstance/ContextRelations.model"));
    resourceContRel.load(null);
    Environment env2 = (Environment) resourceContRel.getContents().get(0);

    env.setTypes(env1.getTypes());
    env.setInstances(env1.getInstances());
    env.setContextRelations(env2.getContextRelations());

如您所见,对象 "Environment" 是我所有元模型的根对象,它应该包含在我解析 xmi 文件后正确设置的所有 EList 对象。

这里的问题是在 EList "ContextRelations" 中应该有对另一个对象 "Parameter" 的引用,该对象具有对对象 Type 的引用。如果我尝试检索类型,则会出现空引用! 我深入搜索了关于此问题的另一个问题,但我找到的最接近的问题是此 link 上的一个未回答的问题:Loading Multiple files using EMF resource load?

这里有两个xmi文件: ContextRelations.model

<parameters number="5">
  <type href="instancesTypes.model#//@types.0"/>
</parameters>
<parameters number="6">
  <type href="instancesTypes.model#//@types.4"/>
</parameters>
<contextRelations name="in"parameters="//@parameters.0//@parameters.1">
  <initialComplexEvent href="Events.model#//@events.0"/>
  <endingComplexEvent href="Events.model#//@events.1"/>
</contextRelations>

InstancesTypes.model

<types name="Emp"/>
<types name="Cam"/>
<types name="Comp"/>
<types name="Fi"/>
<types name="Loc"/>
<types name="St"/>
<types name="Read"/>
<instances name="Alice" type="//@types.0"/>
<instances name="r01" type="//@types.4"/>
<instances name="Bob" type="//@types.0"/>
<instances name="cctv1" type="//@types.1"/>
<instances name="doc" type="//@types.3"/>
<instances name="m1" type="//@types.2"/>
<instances name="m2" type="//@types.2"/>
<instances name="m3" type="//@types.2"/>
<instances name="nfc01" type="//@types.6"/>
<instances name="usb1" type="//@types.5"/>

第二个问题:

如您所见,我使用了三个根对象:env1 和 env2 用作临时变量,将它们的内容放入主根对象 (env) 中。 我这样做是因为我不知道如何解析所有 xmi 文件同时创建一个根对象。

有人可以帮助我吗?

感谢这个网页,我解决了这个问题:http://www.bar54.de/2012/04/emf-load-model-with-eproxyuri-references/

基本上我必须创建一个资源集,将所有资源放入该集中以解决代理问题(交叉引用)。