EMF — преобразование модели XML в XMI

Я создал метамодель .ecore и .genmodel из файла .xsd. Я пытаюсь создать экземпляр модели из файла .xml, соответствующего файлу .xsd (и, как следствие, метамодели .ecore). Как я могу достичь этой цели?


person lmove    schedule 01.06.2014    source источник


Ответы (2)


Только вам нужно загрузить свой файл XML в ресурс EMF, установив для параметра загрузки XMLResource.OPTION_SUPPRESS_DOCUMENT_ROOT значение true. После этого вам нужно создать выходной ресурс, установив URI в качестве вашего файла .xmi. Наконец, вы получаете свой корневой элемент из ресурса модели XML и вставляете его в свой ресурс модели XMI, после чего сохраняете свою выходную модель, и все готово.

Resource loadResource = new ResourceImpl(sourceURI); //We create a resource with XML file uri as parameter, to load de XML model.

// Set option to load configuration file
Map options = new HashMap(); 
// The option below deleted Document root in output file
options.put(XMLResource.OPTION_SUPPRESS_DOCUMENT_ROOT, true);
loadResource.load(options); // Now we have load the XML model

// Create an output resource where copy element from input resource
Resource resourceOut = new Resource(targetURI); //We create a resource to XMI file

// Copying elements from input resource to output resource
EList<EObject> listObj = loadResource.getContents();
EObject obj = listObj.get(0);
resourceOut.getContents().add(obj);

resourceOut.save() //We serialize the resource to the XMI file
person victormpav    schedule 02.06.2014
comment
Я реализовал ваше решение, но получаю то же содержимое моего XML. Разница заключается в расширении сгенерированного XMI. Я создал простой парсер на Java, но не думаю, что это лучшее решение. У тебя есть идеи? - person lmove; 07.06.2014

В конце мне просто нужно изменить имя корневого узла. Для достижения этой цели вам просто нужно выполнить следующие шаги:

  1. На диаграмме ecore щелкните правой кнопкой мыши свой корневой узел (эквивалент вашего корневого узла в вашем XML-файле).
  2. Нажмите «Создать динамический экземпляр».
  3. Сделать тестовую модель. Эта модель является экземпляром XMI.
  4. В конце вам просто нужно изменить информацию о вашем узле на новую (сгенерированную в модели XMI).

В моем случае я заменил

/* At XML file */

<featureModel>
//Here you find the model nodes
...
</ featureModel>

С участием

/* XML file converted to XMI file. This file conforms to XSD and ecore model. */

<ide:FeatureModelType [here you will find some attributes]>
//Here you find the model nodes just as they where defined earlier
...
</ide:FeatureModelType>

Конечно, это можно сделать программно.

person lmove    schedule 29.07.2014