繁体   English   中英

如何以编程方式从XSD架构生成EMF模型(.ecore,.genmodel)?

[英]How to programmatically generate an EMF model (.ecore, .genmodel) from XSD schema?

我一直在尝试将其作为独立应用程序中的最后一个步骤,以将建模程序使用的文件格式转换为EMF模型。 我能够将原始格式转换为XSD,可以使用Eclipse导入程序将其手动转换为EMF模型,但是我不知道如何以编程方式执行此操作以使过程自动化。 Java命令可以正常工作,就像任何命令行语句一样可以正常工作,因为我可以从Java内部执行该语句。 我花了一段时间寻找方法,尝试使用http://wiki.eclipse.org/Generating_Dynamic_Ecore_from_XML_Schema和其他各种可能的解决方案,但似乎没有任何效果。 如果有人能够提供一些示例代码,说明如何从XSD文件生成.ecore和(/或?).genmodel文件,我将不胜感激,但即使是有关如何进行的一些指导,将非常有帮助。

谢谢。

看一看org.eclipse.xsd.ecore.XSDEcoreBuilder类及其在Eclipse导入器向导中的使用方式。
似乎使用起来非常简单,只需调用它的generate方法之一,然后返回Collection<Resource>Collection<EObject>

(编辑:在评论中回答其他问题)
EPackage类是xs:schema的Ecore等效项,其中包含EClass es,而EClass则是xs:complexType的Ecore等效项。

以下代码片段应创建foo.ecore文件并将其保存到与源XSD相同的文件夹中。 如果foo.xsd具有其他导入的XSD,它们将被覆盖到单独的.ecore文件中,因此返回类型为Collection<Resource>

URI schemaURI = URI.createFileURI("foo.xsd");
Collection<Resource> ecoreResources = XSDEcoreBuilder.generateResources(schemaURI);
for (Resource ecoreResource : ecoreResources) {
    ecoreResource.save(null);
}

上面的代码在这里使用以下设置工作:

版本:Luna Service Release 2(4.4.2)内部版本:20150219-0600

插件:

  • ATL SDK-ATLAS转换语言SDK 3.5.0.v201405260755 org.eclipse.m2m.atl.sdk.feature.group
  • Eclipse建模项目Eclipse建模工具4.4.2.20150219-0708 epp.package.modeling
  • 适用于Ecore 1.4.0的Kermeta MDK fr.irisa.triskell.kermeta.ecore.feature.group IRISA / INRIA
  • OCL示例和编辑器SDK 3.4.4.v20150213-2254 org.eclipse.ocl.examples.feature.group
  • Eclipse建模项目
  • Xtext Complete SDK 2.7.3.v201411190455 org.eclipse.xtext.sdk.feature.group Eclipse建模项目

但是,初始XSD文件会被Ecore内容覆盖。 另外, save操作被调用两次(对于XSDResourceImpl一次,对于EcoreResourceFactoryImpl一次)。 我们仅对EcoreResourceFactoryImpl需要它。 要解决此问题,请参见以下示例代码:

    URI schemaURI = URI.createFileURI("library3.xsd");
    File outputFile = new File("library3.ecore");
    XSDEcoreBuilder xsdEcoreBuilder = new XSDEcoreBuilder(); 
    Collection<Resource> ecoreResources = xsdEcoreBuilder.generateResources(schemaURI);

    // for every resource found (includes eventually referenced XSDs)
    for (Resource ecoreResource : ecoreResources) {
        try {
            if (ecoreResource.getClass().getName().contains("EcoreResourceFactoryImpl")) {
                ecoreResource.save(new FileOutputStream(outputFile), null);
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM