Как использовать EMF для чтения XML-файла?
EMF = Eclipse рамки моделирования
Я должен использовать EMF в одном из моих проектов класса. Я пытаюсь понять, как использовать EMF, чтобы сделать следующее:
- чтение XML,
- получить значения в объекты.
- используйте ORM для сохранения значений в объектах в базе данных. - Молодец
- получить данные из базы данных с помощью ORM и генерировать XML.
Мне нужно сделать все это, используя: EMF (не знаю, что так всегда) и JPA (СДЕЛАННЫЙ.)
Я использовал JAXB, и я знаю, что это можно сделать с помощью JAXB, но как (EMF == JAXB)?!
Я создал много классов java, используя EMF, но их так много! Где реализовать методы чтения / записи и как запустить EMF проект?
спасибо
обновление 1 НАМЕК http://www.eclipsezone.com/eclipse/forums/t58829.html
обновление 2
У меня есть схемы и я сгенерировал код модели с помощью .XSD-файл. Теперь у меня возникли проблемы с чтением данных из XML-файла.
5 ответов
EMF сериализует модель данных, используя (по умолчанию, самый популярный способ) XMIResourceImpl, который строго использует формат XMI, а не пользовательскую структуру XML.
см.http://eclipsedriven.blogspot.com/ для статей о EMF и его случаях использования.
Я согласен с другими ответчиками, что EMF, вероятно, не то, что вы хотите здесь.
Если я действительно хочу использовать EMF с пользовательской структурой XML( т. е. не XMI), я бы, вероятно, использовал JAXB для маршал / unmarshal мои объекты EMF (EObjects).
таким образом, EMF не то же самое, что JAXB, и у них разные цели и задачи. На самом деле вы, вероятно, можете каким-то образом объединить EMF и JAXB. Я никогда не пробовал, но, похоже, есть допустимые случаи использования. (как я уже сказал выше, для маршалинга / unmarshaling объектов EMF в / из XML)
чтобы понять EMF, вам нужно переключить свою парадигму. Для начала удалите часть "XML", отпустите ее из своего ума. Тогда я предлагаю вам сделать следующий:
- создайте пустой проект EMF.
- создайте простой файл Ecore (.ecore), или получить его из интернета. Или импортируйте из любой XML-схемы / UML-файла в модель Ecore.
- щелкните правой кнопкой мыши на EClass затем "создать динамический экземпляр", это создаст.файл xmi.
- открыть .файл xmi, используя Eclipse, откроет редактор EMF для этой модели. Отредактируйте, как считаете нужным.
- проверьте содержимое (отредактировано).xmi файл. Вы увидите, что формат точно соответствует модели Ecore. Вы не сможете изменить/настроить отображение из файла model 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. (и, возможно, ЦДО)
Что касается "XML", если вы придерживаетесь XMI и довольны им, EMF сделает вашу жизнь много легче, так как вам не надо делать любой отображение (в отличие от JAXB). Недостатком является то, что наши объекты должны быть объектами ЭДС.
объекты EMF-это объекты, созданные EMF и реализующие EObject и прямо или косвенно расширяющие EObjectImpl. Обычно вы не хотели бы кодировать объекты EMF вручную, это было бы рутиной. С другой стороны, "объекты" JAXB обычно являются чисто доменными объектами POJOs и не имеют дополнительных требований от JAXB. Обратите внимание, что в отличие от JAXB,объекты EMF не являются POJOs. этот объясняет другую цель между 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.
вам не нужно реализовывать методы чтения/записи. Вместо этого вы используете код библиотеки EMF для импорта и экспорта XML. У меня сейчас нет моей книги по ЭМП передо мной, но она покрыта там. В качестве альтернативы, взгляните на то, что генерируется 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.