3

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

谢谢你。

4

2 回答 2

5

查看该类org.eclipse.xsd.ecore.XSDEcoreBuilder以及 Eclipse 导入器向导使用它的方式。
似乎使用起来相当简单,您只需调用它的一个generate方法,然后返回 aCollection<Resource>或 a Collection<EObject>

(编辑:在评论中回答其他问题)
该类EPackage是 的 Ecore 等价物xs:schema,其中包含EClasses,而 es 又是xs:complexTypes 的 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);
}
于 2009-08-05T16:32:27.393 回答
2

The above-mentioned code works here using the following setup:

Version: Luna Service Release 2 (4.4.2) Build id: 20150219-0600

Plugins:

  • ATL SDK - ATLAS Transformation Language SDK 3.5.0.v201405260755 org.eclipse.m2m.atl.sdk.feature.group
  • Eclipse Modeling Project Eclipse Modeling Tools 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 Examples and Editors SDK 3.4.4.v20150213-2254 org.eclipse.ocl.examples.feature.group
  • Eclipse Modeling Project
  • Xtext Complete SDK 2.7.3.v201411190455 org.eclipse.xtext.sdk.feature.group Eclipse Modeling Project

However, the initial XSD file is overwritten by the Ecore content. Also, the save operation is called twice (once for the XSDResourceImpl and once for EcoreResourceFactoryImpl). We need it only for EcoreResourceFactoryImpl. To fix this, here the sample code:

    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();
        }
    }
于 2015-03-24T08:47:16.340 回答