如何使用EMF读取XML文件?

如何使用EMF读取XML文件?

问题描述:

EMF = Eclipse建模框架如何使用EMF读取XML文件?

我必须在我的一个类项目中使用EMF。我想了解如何使用EMF做到以下几点:

  1. 读取XML,
  2. 获取价值为对象。
  3. 使用ORM将对象中的值保存到数据库中。 - 完成
  4. 使用ORM从数据库获取数据并生成XML。

我需要做的所有使用:EMF(不知道什么是如此)和JPA(完成)。

我已经使用JAXB,我知道,这可以使用JAXB来完成,但(EMF == JAXB)怎么样?!

我已经创建了许多使用EMF的java类,但其中有很多!我在哪里实施读/写方法,以及如何运行EMF项目?

感谢

UPDATE1 提示 http://www.eclipsezone.com/eclipse/forums/t58829.html

UPDATE2

我有模式,我已经产生使用的.xsd型号代码。现在我在从XML文件读取数据时遇到问题。

+0

我不认为EMF是为此目的而设计的。这是一个建模,而不是一个绑定框架 – Bozho 2010-04-08 20:04:42

+0

它用于XML绑定,我相信这一点。 – zengr 2010-04-09 01:11:16

+0

@Bozho - EMF是(或可以用作)建模框架或绑定框架。这取决于你从哪里开始...以及你的观点。 (这是元建模常常被误解的一个方面,模型可以被看作是数据,反之亦然。) – 2010-04-09 10:15:35

EMF使用(默认的,最流行的方式)XMIResourceImpl序列化数据模型,其中严格使用XMI格式,而不是自定义XML结构。关于EMF及其使用案例的文章,请参阅http://eclipsedriven.blogspot.com/

我同意其他回答者EMF可能不是你想要的。

如果我真的想用自定义XML结构(即不是XMI)的EMF,我可能会使用JAXB编组/ EMM对象(EObject)。

所以EMF和JAXB不一样,他们有不同的目的和目标。事实上,你可能会以某种方式组合EMF和JAXB。我从来没有尝试过,但似乎有有效的用例。 (正如我上面所说的,用于将XML对EMF对象进行编组/解组)

要理解EMF,您需要切换您的范例。首先删除“XML”部分,让它离开你的想法。然后我建议你做以下几点:

  1. 创建一个空的EMF项目。
  2. 创建一个简单的Ecore文件(.ecore),或从Internet获取。或者从任何XML Schema/UML文件导入Ecore模型。
  3. 右键单击一个EClass然后“创建动态实例”,这将创建一个.xmi文件。
  4. 使用Eclipse打开.xmi文件,这将打开该模型的EMF编辑器。如你所见,编辑。
  5. 检查(编辑的).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读取器可能会有所不同。所以,回到我原来的答案,看看生成的代码!

+0

你可以给我一个开始,什么是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

+0

请检查update2。 – zengr 2010-04-09 09:35:39

+0

是的,CDO或Teneo在数据库中存储EMF模型时值得研究。 Teneo:http://www.eclipse.org/modeling/emft/?project=teneo – lothar 2010-10-25 20:21:35

可以读取任意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); 
+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