Вопрос

EMF = Платформа моделирования Eclipse

Мне нужно использовать EMF в одном из моих классных проектов.Я пытаюсь понять, как использовать ЭДС, чтобы сделать следующее:

  1. Чтение XML,
  2. Получите значения в объекты.
  3. Используйте ORM для сохранения значений объектов в базе данных.- Сделанный
  4. Получите данные из базы данных с помощью ORM и сгенерируйте XML.

Мне нужно сделать все это, используя:EMF (понятия не имею, что именно) и JPA (СДЕЛАНО).

Я использовал JAXB и знаю, что это можно сделать с помощью JAXB, но как (EMF == JAXB)?!

Я создал множество Java-классов с использованием EMF, но их так много!Где мне реализовать методы чтения/записи и как запустить проект EMF?

Спасибо

ОБНОВЛЕНИЕ1НАМЕКАТЬhttp://www.eclipsezone.com/eclipse/forums/t58829.html

ОБНОВЛЕНИЕ2

У меня есть схема, и я создал код модели, используя .xsd.Теперь у меня возникла проблема с чтением данных из XML-файла.

Это было полезно?

Решение

EMF сериализует модель данных, используя (самый популярный способ по умолчанию) XMIResourceImpl, который строго использует формат XMI, а не специальную структуру XML..

Видеть http://eclipsedriven.blogspot.com/ за статьи об ЭМП и вариантах ее использования.

Я согласен с другими ответившими, что ЭМП, вероятно, не то, что вам нужно.

Если я действительно хочу использовать EMF с собственной структурой XML (т.не XMI), я бы, вероятно, использовал JAXB для маршалинга/демаршалинга моих объектов EMF (EObjects).

Таким образом, EMF — это не то же самое, что JAXB, и у них разные цели и задачи.На самом деле вы, вероятно, можете каким-то образом объединить EMF и JAXB.Я никогда не пробовал, но, похоже, есть реальные варианты использования.(как я уже говорил выше, для маршалинга/демаршалинга объектов EMF в/из XML)

Чтобы понять ЭМП, вам нужно сменить парадигму.Для начала удалите часть «XML», выкиньте ее из головы.Тогда я предлагаю вам сделать следующее:

  1. Создайте пустой проект EMF.
  2. Создайте простой файл Ecore (.ecore) или скачайте его из Интернета.Или импортируйте из любого файла XML-схемы/UML в модель Ecore.
  3. Щелкните правой кнопкой мыши EClass, затем «Создать динамический экземпляр», это создаст файл .xmi.
  4. Откройте файл .xmi с помощью Eclipse. Откроется редактор EMF для этой модели.Редактируйте по своему усмотрению.
  5. Проверьте содержимое (отредактированного) файла .xmi.Вы увидите, что формат точно соответствует модели Ecore.Вы не сможете изменить/настроить сопоставление модели <-> файла XMI, поскольку, как следует из названия, XMIResourceImpl только читает/сохраняет файлы XMI (которые реализованы поверх XML), но не читает/сохраняет произвольный формат XML.

EMF имеет поддержку чтения/записи. Метамодели XML-схемы (т.е.XSD-файлы) с целью их преобразования в метамодель Ecore, но не файлы XML, соответствующие такой схеме (даже в Ecore), если только эти файлы не находятся в формате XMI.

О сохранении моделей EMF в реляционной базе данных см.:http://eclipsdriven.blogspot.com/2010/12/persisting-emf-objects-to-rdbms-with.html

Я использую Тенео.(и необязательно CDO)

Что касается «XML», то если вы будете придерживаться XMI и будете им довольны, EMF сделает вашу жизнь много проще, так как вам не нужно этого делать любой отображение (в отличие от JAXB).Обратной стороной является то, что наши объекты должны быть объектами EMF.

Объекты EMF — это объекты, которые создаются EMF и реализуют EObject и прямо или косвенно расширяют EObjectImpl.Обычно вам не захочется кодировать объекты EMF вручную, это будет рутинная работа.С другой стороны, «объекты» JAXB обычно представляют собой POJO чисто доменных объектов и не имеют дополнительных требований со стороны JAXB.Обратите внимание, что в отличие от JAXB, Объекты EMF не являются POJO. Это объясняет еще одну разную цель EMF и JAXB.Их перекрытие меньше, чем вы можете себе представить.

Чтение из XMI (не XML) очень просто:

XMIResource resource = new XMIResourceImpl(URI.create("file:/path/to/mymodel.xmi"));
resource.load(null);
System.out.println( resource.eContents().get(0) );

Другие советы

Вы можете читать произвольные XML-файлы с помощью EMF, если у вас есть для них XSD, и вам даже не нужно генерировать классы Java из XSD.
Я писал об этом в блоге пару месяцев назад, но я также вставлю сюда фрагменты кода.Более подробное объяснение можно найти в моем сообщении в блоге. Как загрузить и сравнить произвольные файлы XML с EMF.

Сначала вам нужно загрузить XSD и инициализировать пару вещей:

// generate EPackages from schemas
XSDEcoreBuilder xsdEcoreBuilder = new XSDEcoreBuilder();
Collection generatedPackages = xsdEcoreBuilder.generate(schemaURI);

// register the packages loaded from XSD
for (EObject generatedEObject : generatedPackages) {
    if (generatedEObject instanceof EPackage) {
        EPackage generatedPackage = (EPackage) generatedEObject;
        EPackage.Registry.INSTANCE.put(generatedPackage.getNsURI(),
            generatedPackage);
    }
}

// add file extension to registry
ResourceFactoryRegistryImpl.INSTANCE.getExtensionToFactoryMap()
    .put(MY_FILE_EXTENSION, new GenericXMLResourceFactoryImpl());

После этого вы можете загрузить файлы XML, как обычно:

ResourceSet resourceSet = ResourceSetFactory.createResourceSet();
Resource resource = resourceSet.getResource(xmlURI, true);
resource.load(Collections.EMPTY_MAP);
EObject root = resource.getContents().get(0);

Я создал небольшую программу, которая выполняет некоторые преобразования формата базовой модели, используя emftriple (ранее emf4sw), т.е.Ecore XMI (файл XML) в RDF TTL.

Я использовал некоторые советы из ответов здесь, так что спасибо, ребята!

Возможно, исходный код сможет вас вдохновить: https://github.com/frostyandy2k/model-transformer

Обычный способ сделать это — начать со схемы XML, затем использовать ее для создания модели EMF, а затем генерировать код Java.Это описано в это руководство по ЭМП.

Вам не нужно реализовывать методы чтения/записи.Вместо этого вы используете код библиотеки EMF для импорта и экспорта XML.У меня сейчас нет экземпляра книги по ЭМП, но она там описана.Альтернативно, посмотрите, что делает сгенерированный редактор EMF, когда вы загружаете или сохраняете экземпляр модели.

РЕДАКТИРОВАТЬ

Вот класс полезности ресурсов из проекта на основе ЭМП, который я разработал пару лет назад.Посмотрите на load* методы.Обратите внимание, что это не обязательно лучший способ сделать это...но это сработало для меня.

РЕДАКТИРОВАТЬ 2

Я только что понял, что использую XMI, а не простой XML.Настройка средства чтения XML с использованием пользовательской схемы и (потенциально) настроенного сопоставления схемы, вероятно, будет отличаться.Итак, возвращаясь к моему первоначальному ответу, посмотрите на сгенерированный код!!.

EMF не предназначен для чтения произвольных файлов XML.EMF использует XML в качестве серверной части.Откуда берутся ваши XML-файлы/какой схеме они соответствуют?Если у вас есть схема, вы можете использовать ее для создания модели EMF, которая, в свою очередь, сможет читать ваши XML-файлы.

В противном случае вам придется перепроектировать модель EMF, которая действительно будет сериализоваться в ваш XML, чтобы вы могли ее прочитать, но это было бы хаком.

После ОБНОВЛЕНИЯ2:

Думаю, следующий вопрос: «Какая у вас проблема с загрузкой файлов?»Как это сделать и что не работает?Или вы не знаете, как это сделать?

Сначала вам необходимо настроить фабрику для вашего набора ресурсов (представление в памяти набора файлов, с которыми вы хотите работать), а затем загрузить файл с помощью getResource(URI, bool).Пример некоторых вещей UML, которые я делаю:

resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put(UMLResource.FILE_EXTENSION, UMLResource.Factory.INSTANCE);
resourceSet.getPackageRegistry().put("http://www.eclipse.org/uml2/2.0.0/UML", UMLPackage.eINSTANCE);
Resource r = resourceSet.getResource(uriToYourFile,true);
YourModelRootType root = (YourModelRootType) r.getContents().get(0);

Все это должно быть описано в руководстве, ссылка на которое у вас уже есть.Затем вы можете использовать сгенерированный Java API для работы от «root».

У меня нет опыта работы с ORM, но, возможно, вам стоит взглянуть на CDO.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top