0

我需要通过 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 schema: XMI.xsd,得到一个xmi.genmodel文件
  • 在eclipse中使用xmi.genmodel生成所有代码,会生成模型代码
  • 新建一个 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.xmixmlns:uml="http://www.omg.org/spec/UML/20110701"里面有一个命名空间,所以我去了 uml 空间的链接,并试图找到 UML 的架构。不幸的是,在这个链接中,所有关于 UML 的文件都是 XMI 格式的。

所以我尝试了另外两个选项:

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

您可以在 OMG 网站 XMI XSD 2.1.1 上找到 XMI XSD,但您还需要 UML Schema 和 MOF Schema。读取和写入 UML XMI 文件的更好方法是使用 Eclipse UML 实现。它可以很容易地在 Eclipse 之外的一个简单的 Java 程序中使用:请参阅

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

所以我希望有人能给我一些建议。提前感谢您的帮助!

4

1 回答 1

0

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

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

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

于 2016-10-10T10:03:29.190 回答