使用EMF

时间:2016-03-01 13:53:04

标签: java xsd modeling emf xmi

我需要通过EMF加载和解析xmi文件(版本:OMG XMI 2.4.1),但现在卡住了。

OMG XMI Spec 2.4.1中,有一个XMI架构 XMI.xsd 和一个 XMI-model.xmi 。所以在这里,例如,我需要通过EMF加载和解析 XMI-model.xmi

我做了如下:

  • 在Eclipse中新建EMF项目
  • 导入xmi架构: XMI.xsd ,并获取 xmi.genmodel 文件
  • 使用 xmi.genmodel 在eclipse中生成所有代码,它将生成模型代码
  • 新建一个Junit4测试用例并尝试使用 Junit插件测试加载 XMI-model.xmi 文件,但失败了,以下是我的代码。

    @Test
    public void test() throws IOException {
        URI uri = URI
                .createFileURI("/home/pzhengshuai/Desktop/15Feb-19Feb/XMI-model.xmi");
        _20110701ResourceFactoryImpl factory = new _20110701ResourceFactoryImpl();
        Resource resource = factory.createResource(uri);
        Map<String, Boolean> options = new HashMap<String, Boolean>();
        options.put(XMLResource.OPTION_KEEP_DEFAULT_CONTENT, Boolean.TRUE);
        resource.load(options);
        EObject model = (EObject) resource.getContents().get(0);
        Assert.assertNotNull(model);
    }
    

例外是:

org.eclipse.emf.ecore.resource.Resource$IOWrappedException: Feature 'XMIType' not found. (file:/home/pzhengshuai/Desktop/15Feb-19Feb/XMI-model.xmi, 2, 164)

好的,然后我尝试读取xsd文件和xmi文件,我发现 XMI-model.xmi 中有一个名称空间xmlns:uml="http://www.omg.org/spec/UML/20110701",所以我去了链接uml空间并试图找到UML的模式。不幸的是,在这个链接中,关于UML的所有文件都是格式XMI。

所以我尝试了两个选项:

  1. 尝试使用Enterprise Architect和Altova XMLspy将 UML.xmi 转换为 UML.xsd ,并执行上述相同操作,失败。就个人而言,我认为这种转换可能会丢失一些信息。
  2. 我找到了一个类似的问题here
  3.   

    您可以在OMG网站XMI XSD 2.1.1上找到XMI XSD,但您还需要UML Schema和MOF Schema。   读取和编写UML XMI文件的更好方法是使用Eclipse UML实现。它可以在Eclipse之外的简单Java程序中轻松使用:参见

    我按照答案阅读了有关Eclipse UML实现的文档,但我认为这不是我想要的。

    所以我希望有人可以给我一些建议。在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

根据您的描述,我无法告诉您确切的上下文,但XMI通常用作元模型实例的序列化格式(即“物理模式”)(类似于“逻辑模式”)。

但是您要做的是使用XMI作为元模型,并使用XML(使用XSD架构)作为序列化格式。这可能不是你想要的。

为了加载使用XMI进行序列化的UML元模型的实例,只需创建资源集并使用.uml加载resourceSet.getResource(uri, true)文件。只要您的Eclipse插件的类路径包含UML插件作为依赖项,这应该可行。