Xtext:将模型导出为 XMI/XML
Xtext: Export model as XMI/XML
我已经用 Xtext 定义了一个 DSL。假设它看起来像这样:
Model:
components+=Component*
;
Component:
House | Car
;
House:
'House' name=ID
('height' hubRadius=DOUBLE)? &
('width' hubRadius=DOUBLE)?
'end' 'House'
;
Car:
'Car' name=ID
('maxSpeed' hubRadius=INT)? &
('brand' hubRadius=STRING)?
'end' 'Car'
;
在基于我的 DSL 生成的 Eclipse IDE 中,我实现了一个模型。假设它看起来像下面这样:
House MyHouse
height 102.5
width 30.56
end House
Car MyCar
maxSpeed 190
brand "mercedes"
end Car
我现在想将该模型导出为 XMI 或 XML 文件。
我想这样做的原因是,我有另一个工作流程,它允许我使用 XMI/XML 文件即时更改模型参数。因此,无需重新定义我的模型,我可以将 XML/XMI 文件传递给工作流,它会自动执行此操作。
简短示例:DSL 允许定义组件 House
和 Car
。 House
允许参数 width
和 height
,Car
允许参数 maxSpeed
和 brand
(见上面的语法)。
所以在我所说的工作流程中,参数将随着不同的值而改变。例如,我正在寻找的生成的 XML 将如下所示:
<model>
<component name='House'>
<param name='height'>102.5</param>
<param name='width'>30.56</param>
</component>
<component name='Car'>
<param name='maxSpeed'>190</param>
<param name='brand'>mercedes</param>
</component>
</model>
如何将我的模型导出为 XMI/XML?
我终于找到了解决办法。下面的代码导出一个 *.xml 文件,就像我在 post:
中要求的那样
private void exportXMI(String absuloteTargetFolderPath) {
// change MyLanguage with your language name
Injector injector = new MyLanguageStandaloneSetup()
.createInjectorAndDoEMFRegistration();
XtextResourceSet resourceSet = injector
.getInstance(XtextResourceSet.class);
// .ext ist the extension of the model file
String inputURI = "file:///" + absuloteTargetFolderPath + "/MyFile.ext";
String outputURI = "file:///" + absuloteTargetFolderPath + "/MyFile.xmi";
URI uri = URI.createURI(inputURI);
Resource xtextResource = resourceSet.getResource(uri, true);
EcoreUtil.resolveAll(xtextResource);
Resource xmiResource = resourceSet
.createResource(URI.createURI(outputURI));
xmiResource.getContents().add(xtextResource.getContents().get(0));
try {
xmiResource.save(null);
} catch (IOException e) {
e.printStackTrace();
}
}
只是对 John 的回答的评论:
在 Eclipse 中 IDE 永远不要使用 MyLanguageStandaloneSetup,注入器的实例必须通过 UI 插件的激活器访问:MyLanguageActivator.getInstance().getInjector(MyLanguageActivator.COM_MYCOMPANY_MYLANGUAGE).
调用 MyLanguageStandaloneSetup.createInjectorAndDoEMFRegistration 将创建一个不同于 Eclipse 使用的注入器的新实例。它还可以破坏 EMF 注册表的状态。
我已经用 Xtext 定义了一个 DSL。假设它看起来像这样:
Model:
components+=Component*
;
Component:
House | Car
;
House:
'House' name=ID
('height' hubRadius=DOUBLE)? &
('width' hubRadius=DOUBLE)?
'end' 'House'
;
Car:
'Car' name=ID
('maxSpeed' hubRadius=INT)? &
('brand' hubRadius=STRING)?
'end' 'Car'
;
在基于我的 DSL 生成的 Eclipse IDE 中,我实现了一个模型。假设它看起来像下面这样:
House MyHouse
height 102.5
width 30.56
end House
Car MyCar
maxSpeed 190
brand "mercedes"
end Car
我现在想将该模型导出为 XMI 或 XML 文件。
我想这样做的原因是,我有另一个工作流程,它允许我使用 XMI/XML 文件即时更改模型参数。因此,无需重新定义我的模型,我可以将 XML/XMI 文件传递给工作流,它会自动执行此操作。
简短示例:DSL 允许定义组件 House
和 Car
。 House
允许参数 width
和 height
,Car
允许参数 maxSpeed
和 brand
(见上面的语法)。
所以在我所说的工作流程中,参数将随着不同的值而改变。例如,我正在寻找的生成的 XML 将如下所示:
<model>
<component name='House'>
<param name='height'>102.5</param>
<param name='width'>30.56</param>
</component>
<component name='Car'>
<param name='maxSpeed'>190</param>
<param name='brand'>mercedes</param>
</component>
</model>
如何将我的模型导出为 XMI/XML?
我终于找到了解决办法。下面的代码导出一个 *.xml 文件,就像我在 post:
中要求的那样private void exportXMI(String absuloteTargetFolderPath) {
// change MyLanguage with your language name
Injector injector = new MyLanguageStandaloneSetup()
.createInjectorAndDoEMFRegistration();
XtextResourceSet resourceSet = injector
.getInstance(XtextResourceSet.class);
// .ext ist the extension of the model file
String inputURI = "file:///" + absuloteTargetFolderPath + "/MyFile.ext";
String outputURI = "file:///" + absuloteTargetFolderPath + "/MyFile.xmi";
URI uri = URI.createURI(inputURI);
Resource xtextResource = resourceSet.getResource(uri, true);
EcoreUtil.resolveAll(xtextResource);
Resource xmiResource = resourceSet
.createResource(URI.createURI(outputURI));
xmiResource.getContents().add(xtextResource.getContents().get(0));
try {
xmiResource.save(null);
} catch (IOException e) {
e.printStackTrace();
}
}
只是对 John 的回答的评论: 在 Eclipse 中 IDE 永远不要使用 MyLanguageStandaloneSetup,注入器的实例必须通过 UI 插件的激活器访问:MyLanguageActivator.getInstance().getInjector(MyLanguageActivator.COM_MYCOMPANY_MYLANGUAGE).
调用 MyLanguageStandaloneSetup.createInjectorAndDoEMFRegistration 将创建一个不同于 Eclipse 使用的注入器的新实例。它还可以破坏 EMF 注册表的状态。