如何使用EMF读取XML文件?

zen*_*ngr 8 java xml eclipse eclipse-emf

EMF = Eclipse Modeling Framework

我必须在我的一个班级项目中使用EMF.我试图了解如何使用EMF执行以下操作:

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

我需要使用以下所有内容:EMF(不知道是什么)和JPA(DONE).

我使用过JAXB,我知道,这可以使用JAXB完成,但是(EMF == JAXB)怎么办?!

我使用EMF创建了许多java类,但是它们有很多!我在哪里实现读/写方法以及如何运行EMF项目?

谢谢

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

UPDATE2

我有架构,我使用.xsd生成了模型代码.现在我在从XML文件中读取数据时遇到了问题.

Zso*_*rök 14

您可以使用EMF读取任意XML文件,前提是您拥有XSD,并且您甚至不必从XSD生成Java类.
几个月前我在博客上写了这篇文章,但我也会在这里粘贴代码片段.有关更详细的说明,请参阅我的博客文章,了解如何使用EMF加载和比较任意XML文件.

首先,您需要加载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());
Run Code Online (Sandbox Code Playgroud)

之后,您可以像往常一样加载XML文件:

ResourceSet resourceSet = ResourceSetFactory.createResourceSet();
Resource resource = resourceSet.getResource(xmlURI, true);
resource.load(Collections.EMPTY_MAP);
EObject root = resource.getContents().get(0);
Run Code Online (Sandbox Code Playgroud)


Hen*_*wan 5

EMF 使用(默认的、最流行的方式)XMIResourceImpl 序列化数据模型,它严格使用 XMI 格式,而不是自定义 XML 结构

有关 EMF 及其用例的文章,请参阅http://eclipsedriven.blogspot.com/

我同意其他回答者的观点,即 EMF 可能不是您想要的。

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

所以 EMF 与 JAXB 不同,它们有不同的目的和目标。事实上,您可能可以以某种方式组合 EMF 和 JAXB。我从未尝试过,但似乎有有效的用例。(正如我上面所说的,用于将 EMF 对象编组/解组到 XML 或从 XML 编组)

要了解 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) );
Run Code Online (Sandbox Code Playgroud)