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

时间:2009-08-05 11:26:50

标签: java xsd eclipse-emf

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

谢谢。

2 个答案:

答案 0 :(得分:3)

查看类org.eclipse.xsd.ecore.XSDEcoreBuilder以及Eclipse导入器向导使用它的方式 似乎相当简单易用,您只需调用其中一个generate方法即可获得Collection<Resource>Collection<EObject>

(编辑:在评论中回答其他问题)
EPackage类是Ecore等效于xs:schema,其中包含EClass es,而xs:complexType es又是Collection<Resource> s的Ecore等价物。

以下代码段应创建foo.ecore文件并将其保存到与源XSD相同的文件夹中。如果foo.xsd有其他导入的XSD,它们将被转换为单独的.ecore文件,因此返回类型为URI schemaURI = URI.createFileURI("foo.xsd"); Collection<Resource> ecoreResources = XSDEcoreBuilder.generateResources(schemaURI); for (Resource ecoreResource : ecoreResources) { ecoreResource.save(null); }

{{1}}

答案 1 :(得分:0)

上述代码使用以下设置:

版本:Luna Service Release 2(4.4.2) 构建ID:20150219-0600

插件:

  • ATL SDK - ATLAS Transformation Language SDK 3.5.0.v201405260755 org.eclipse.m2m.atl.sdk.feature.group
  • Eclipse建模项目Eclipse建模工具4.4.2.20150219-0708 epp.package.modeling
  • Kermeta MDK for Ecore 1.4.0 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建模项目

但是,Ecore内容会覆盖初始XSD文件。此外,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();
        }
    }