如何使用EMF读取XML文件?
EMF = Eclipse建模框架如何使用EMF读取XML文件?
我必须在我的一个类项目中使用EMF。我想了解如何使用EMF做到以下几点:
- 读取XML,
- 获取价值为对象。
- 使用ORM将对象中的值保存到数据库中。 - 完成
- 使用ORM从数据库获取数据并生成XML。
我需要做的所有使用:EMF(不知道什么是如此)和JPA(完成)。
我已经使用JAXB,我知道,这可以使用JAXB来完成,但(EMF == JAXB)怎么样?!
我已经创建了许多使用EMF的java类,但其中有很多!我在哪里实施读/写方法,以及如何运行EMF项目?
感谢
UPDATE1 提示 http://www.eclipsezone.com/eclipse/forums/t58829.html
UPDATE2
我有模式,我已经产生使用的.xsd型号代码。现在我在从XML文件读取数据时遇到问题。
EMF使用(默认的,最流行的方式)XMIResourceImpl序列化数据模型,其中严格使用XMI格式,而不是自定义XML结构。关于EMF及其使用案例的文章,请参阅http://eclipsedriven.blogspot.com/。
我同意其他回答者EMF可能不是你想要的。
如果我真的想用自定义XML结构(即不是XMI)的EMF,我可能会使用JAXB编组/ EMM对象(EObject)。
所以EMF和JAXB不一样,他们有不同的目的和目标。事实上,你可能会以某种方式组合EMF和JAXB。我从来没有尝试过,但似乎有有效的用例。 (正如我上面所说的,用于将XML对EMF对象进行编组/解组)
要理解EMF,您需要切换您的范例。首先删除“XML”部分,让它离开你的想法。然后我建议你做以下几点:
- 创建一个空的EMF项目。
- 创建一个简单的Ecore文件(.ecore),或从Internet获取。或者从任何XML Schema/UML文件导入Ecore模型。
- 右键单击一个EClass然后“创建动态实例”,这将创建一个.xmi文件。
- 使用Eclipse打开.xmi文件,这将打开该模型的EMF编辑器。如你所见,编辑。
- 检查(编辑的).xmi文件的内容。您会看到格式与Ecore模型完全一致。您将无法更改/自定义模型< - > XMI文件的映射,因为顾名思义,XMIResourceImpl只读取/保存XMI文件(恰好在XML之上实现),但不会读取/保存任意的XML格式。
EMF支持读/写XML模式元模型(即,XSD文件),目的是将它们转换为Ecore元模型,但不符合这种模式(甚至不适用于Ecore)的XML文件,除非这些文件采用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模型,然后生成Java代码。这在this EMF tutorial中描述。
您不需要实现读取/写入方法。而是使用EMF库代码来执行XML导入和导出。我现在没有在我面前的EMF书的副本,但它覆盖在那里。或者,查看加载或保存模型实例时生成的EMF编辑器的功能。
编辑
这里是我几年前开发了一个基于EMF的项目resource utility class。查看load*
方法。请注意,这不一定是这样做的最佳方式......但它对我有效。
EDIT 2
我才意识到,我用XMI不是纯XML。使用自定义架构和(可能)自定义架构映射来配置XML读取器可能会有所不同。所以,回到我原来的答案,看看生成的代码!。
你可以给我一个开始,什么是EMF库有哪些方法来读取/写入XML文件? – zengr 2010-04-01 08:38:39
EMF不是为了读取任意XML文件而设计的。 EMF使用XML作为后端。你的XML文件来自哪里?它们符合哪个模式?如果你有模式,那么你可以使用它来创建一个EMF模型,然后希望能够读取你的XML文件。
否则,您将不得不逆向设计一个EMF模型,该模型确实会序列化到您的XML中,以便您能够读取它,但那会是一种破解。
UPDATE2后:
我想接下来的问题则是“什么问题,您有加载您的文件”。你怎么做,什么不工作?或者你不知道该怎么做?
您首先必须为您的资源集(需要使用的文件集的内存中表示)配置工厂,然后使用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。
可以读取任意XML文件与EMF,只要你对他们的XSD,你甚至不必生成Java类来自XSD。
我在几个月前写了一篇关于这方面的文章,但我也会在这里粘贴代码片段。有关更详细的解释,请参阅我的博客文章How to load and compare arbitrary XML files with 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);
嗨@ZsoltTörök - 我在哪找到ResourceSetFactory包? – Magick 2017-08-12 09:33:29
我建立了一个小使用emftriple(以前的emf4sw),即Ecore XMI(XML文件)转换为RDF TTL的一些基本模型格式转换的程序。
我在这里的答案中使用了一些提示,所以谢谢你们!
也许源代码可以激励你:https://github.com/frostyandy2k/model-transformer
我不认为EMF是为此目的而设计的。这是一个建模,而不是一个绑定框架 – Bozho 2010-04-08 20:04:42
它用于XML绑定,我相信这一点。 – zengr 2010-04-09 01:11:16
@Bozho - EMF是(或可以用作)建模框架或绑定框架。这取决于你从哪里开始...以及你的观点。 (这是元建模常常被误解的一个方面,模型可以被看作是数据,反之亦然。) – 2010-04-09 10:15:35