EMF 使用(默认、最流行的方式)XMIResourceImpl 序列化数据模型,它严格使用 XMI 格式,而不是自定义 XML 结构。
有关 EMF 及其用例的文章,请参见http://eclipsedriven.blogspot.com/ 。
我同意其他回答者的观点,即 EMF 可能不是您想要的。
如果我真的想使用带有自定义 XML 结构(即不是 XMI)的 EMF,我可能会使用 JAXB 来编组/解组我的 EMF 对象(EObjects)。
因此 EMF 与 JAXB 不同,它们有不同的目的和目标。事实上,您可能可以通过某种方式将 EMF 和 JAXB 结合起来。我从未尝试过,但似乎有有效的用例。(正如我上面所说,用于将 EMF 对象编组/解组到 XML)
要了解 EMF,您需要转换您的范式。首先删除“XML”部分,让它从你的脑海中消失。那我建议你做以下事情:
- 创建一个空的 EMF 项目。
- 创建一个简单的 Ecore 文件 (.ecore),或从 Internet 获取。或者从任何 XML Schema/UML 文件导入 Ecore 模型。
- 右键单击 EClass 然后“创建动态实例”,这将创建一个 .xmi 文件。
- 使用 Eclipse 打开 .xmi 文件,这将打开该模型的 EMF 编辑器。编辑你认为合适的。
- 检查(编辑的).xmi 文件的内容。您会看到该格式完全符合 Ecore 模型。您将无法更改/自定义模型 <-> XMI 文件的映射,因为顾名思义,XMIResourceImpl 仅读取/保存 XMI 文件(恰好在 XML 之上实现)但它不读取/保存任意 XML 格式。
EMF 支持读取/写入XML Schema 元模型(即 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) );