簡體   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