2016-03-07 5 views
0

Я определил DSL с Xtext. Скажем, это выглядит следующим образом:Xtext: экспортировать модель как XMI/XML

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' 
; 

В сгенерированном Eclipse IDE, который основан на моем DSL, я реализовал модель. Скажем, это выглядит следующим образом:

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?

ответ

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(); 
    } 
} 
1

Просто комментарий к ответу Джона: Внутри Eclipse IDE никогда не использовать MyLanguageStandaloneSetup, экземпляр инжектора должен быть доступен через активатор плагин UI: MyLanguageActivator.getInstance(). getInjector (MyLanguageActivator.COM_MYCOMPANY_MYLANGUAGE).

Вызов MyLanguageStandaloneSetup.createInjectorAndDoEMFRegistration создаст новый экземпляр Инжектора, который отличается от используемого Eclipse. Также он может нарушить состояние регистров EMF.

+0

Большое спасибо за комментарий! Хотя я успешно импортирую MyLanguageActivator, во время выполнения я получаю «NoClassDefFoundError». Вы знаете, почему это происходит? – John

+0

Как вы выполняете экспорт? Если внутри Eclipse, когда вы должны поместить свой код в плагин пользовательского интерфейса, чтобы иметь доступ к активатору. Если снаружи вы можете поместить его в проект langauge и использовать автономную настройку. –

 Смежные вопросы

  • Нет связанных вопросов^_^