zen*_*ngr 8 java xml eclipse eclipse-emf
EMF = Eclipse Modeling Framework
我必须在我的一个班级项目中使用EMF.我试图了解如何使用EMF执行以下操作:
我需要使用以下所有内容: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)
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”部分,让它从你的脑海中消失。那么我建议你做以下事情:
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)
| 归档时间: |
|
| 查看次数: |
17475 次 |
| 最近记录: |