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