Как использовать EMF для чтения XML-файла?

EMF = Eclipse Modeling Framework

Я должен использовать EMF в одном из моих проектов класса. Я пытаюсь понять, как использовать 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

UPDATE2

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

5 ответов

Решение

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

Смотрите http://eclipsedriven.blogspot.com/ статьи о EMF и его случаях использования.

Я согласен с другими ответчиками, что EMF, вероятно, не то, что вы хотите здесь.

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

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

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

  1. Создайте пустой проект EMF.
  2. Создайте простой файл Ecore (.ecore) или получите его из Интернета. Или импортируйте из любого файла XML Schema/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://eclipsedriven.blogspot.com/2010/12/persisting-emf-objects-to-rdbms-with.html

Я использую Teneo. (и, необязательно, 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-файл) в TTL RDF.

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

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

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

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

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

Вот класс утилит ресурсов из 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.

Другие вопросы по тегам