2009-08-05 9 views
1

Я пытался сделать это как последний этап автономного приложения для преобразования из формата файла, используемого программой моделирования, в модель EMF. Я могу преобразовать исходный формат в XSD, который я могу вручную преобразовать в EMF-модель с использованием импортера Eclipse, но я не знаю, как это сделать программно, чтобы автоматизировать процесс. Java-команды будут работать нормально, как и любой оператор командной строки, чтобы сделать то же самое, так как я мог просто выполнить инструкцию из Java. Я потратил некоторое время на поиски, как это сделать, используя http://wiki.eclipse.org/Generating_Dynamic_Ecore_from_XML_Schema и множество других возможных решений, но ничего не работает. Если кто-то может предоставить некоторый пример кода о том, как сгенерировать файлы .ecore и (/ или?) .genmodel из файла XSD, я был бы очень признателен, но даже некоторые рекомендации относительно того, как я могу продолжить очень поможет.Как программно генерировать EMF-модель (.ecore, .genmodel) из схемы XSD?

спасибо.

ответ

3

Посмотрите на класс org.eclipse.xsd.ecore.XSDEcoreBuilder и способ его использования мастером импортера Eclipse.
Похоже, что вы можете просто использовать один из своих методов generate, и вы возвращаетесь либо Collection<Resource>, либо Collection<EObject>.

(Edit: отвечать на дополнительные вопросы в комментариях)
The EPackage класс является Ecore эквивалент xs:schema, который содержит EClass Э.С., которые в свою очередь Ecore эквивалентов xs:complexType с.

Следующий фрагмент кода должен создать и сохранить файл 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); 
} 
+0

Глядя на исходный код Eclipse, часто является лучшим способом найти ответы на такие вопросы.Материал, который вы найдете в вики или в новостных группах Eclipse, часто устарел. –

+0

Я пробовал просматривать импортер Eclipse XSD, чтобы узнать, как он использует XSDEcoreBuilder. Кажется, он делает что-то подобное, создавая список EPackage. Я полагаю, что сборник в http://wiki.eclipse.org/Generating_Dynamic_Ecore_from_XML_Schema также является списком EPackage из-за кода, в котором он выполняет итерацию через коллекцию, чтобы получить каждый отдельный EPackage. Тем не менее, я не понимаю, что вы делаете с этим EPackage, чтобы получить его, скажем, в одном из форматов .ecore или .genmodel или как его вообще читать. То есть, что мне делать с этим EPackage? Простите, что это невежественное. – 2009-08-06 05:12:20

+0

Попытка вызвать generateResources дает ошибку во время выполнения: Исключение в потоке «основного» java.lang.NullPointerException на org.eclipse.xsd.ecore.XSDEcoreBuilder.generateResources (XSDEcoreBuild er.java:2765) в org.eclipse.xsd .ecore.XSDEcoreBuilder.generateResources (XSDEcoreBuild er.java:2742) at ... Вызов генерации вместо generateResources, похоже, работает; однако он генерирует EPackage вместо ресурса, но я не знаю, как его сохранить. Я попытался найти код generateResources и подражать этому в своем коде, но я не могу получить доступ ко всем методам. Спасибо за вашу помощь; выглядит ближе. – 2009-08-07 10:34:17

0

Вышеупомянутый код работает здесь, используя следующие настройки:

Версия: Luna Service Release 2 (4.4.2) Идентификатор сборки: 20150219-0600

Плагины:

  • ATL SDK - ATLAS Transformation Language SDK 3.5.0.v201405260755 org.eclipse.m2m.atl.sdk.feature.group
  • Eclipse Modeling Project Eclipse Modeling Tools 4.4.2.20150219-0708 epp.package.modeling
  • Kermeta MDK для Ecore 1.4.0 fr.irisa.triskell.kermeta.ecore.feature.group IRISA/INRIA
  • OCL Примеры и редакторов SDK 3.4.4.v20150213-2254 org.eclipse.ocl.examples.feature.group
  • Eclipse Modeling Project
  • XText Полный SDK 2.7.3.v201411190455 org.eclipse.xtext.sdk.feature.group Eclipse Modeling Project

Однако исходный файл 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(); 
     } 
    } 
Смежные вопросы