0

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許可します(上記の文法を参照)。maxSpeedbrand

そのため、私が話していた私のワークフローでは、パラメーターはさまざまな値で変更されます。たとえば、私が探している生成された 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 としてエクスポートするにはどうすればよいですか?

4

2 に答える 2

1

私は最終的に解決策を見つけました。次のコードは、冒頭の投稿で要求されたように *.xmi ファイルをエクスポートします。

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();
    }
}
于 2016-03-09T07:56:38.687 に答える
1

ジョンの答えへのコメント: Eclipse IDE 内では MyLanguageStandaloneSetup を使用しないでください。

MyLanguageStandaloneSetup.createInjectorAndDoEMFRegistration を呼び出すと、Eclipse で使用されるものとは異なる Injector の新しいインスタンスが作成されます。また、EMF レジストリの状態を壊す可能性があります。

于 2016-03-10T00:19:11.657 に答える