使用EMF加载多个xmi文件
我一直使用EMF三周。 我已经使用正在运行的Eclipse应用程序创建了我的元模型和一个实例。现在我的问题是,我有多个由运行的Eclipse实例保存的XMI文件,我想解析它们以创建处理xml文件中的数据的另一个文本文件。 为此,我使用了EMF的XMIResource API,并且当我加载没有与其他xmi文档交叉引用的文件时,一切顺利。但是,当我加载一个xmi文档时,对其他xmi文档进行交叉引用时,所有交叉引用都没有在我的Java模型中正确保存。使用EMF加载多个xmi文件
我用这段代码加载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());
正如你所看到的物体“环境”是所有的元模型的我的根对象应该包含所有的EList对象正确在解析xmi文件后设置。
这里的问题是,在EList的“ContextRelations”内部应该有一个对称为“Parameter”的另一个对象的引用,该对象引用了对象Type。如果我尝试检索类型空引用出来! 我深深搜寻有关此问题的另一个问题,但最接近的一种,我发现了可以在此链接一个没有回答的问题: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/
基本上,我不得不为了解决代理(交叉引用)创建资源设置把所有的资源里面的设置。