[英]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
插件:
但是,初始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.