Java 如何使用EMF读取XML文件?
EMF=Eclipse建模框架 我必须在我的一个班级项目中使用EMF。我试图了解如何使用EMF执行以下操作:Java 如何使用EMF读取XML文件?,java,xml,eclipse,eclipse-emf,Java,Xml,Eclipse,Eclipse Emf,EMF=Eclipse建模框架 我必须在我的一个班级项目中使用EMF。我试图了解如何使用EMF执行以下操作: 阅读XML 将值放入对象中 使用ORM将对象中的值持久化到数据库中。-完成 使用ORM从数据库获取数据并生成XML 我需要使用:EMF(不知道曾经发生过什么)和JPA(DONE)来完成所有这些 我使用过JAXB,我知道,这可以通过JAXB来实现,但是(EMF==JAXB)是如何实现的呢 我已经使用EMF创建了许多java类,但是它们太多了!在哪里实现读/写方法,如何运行EMF项目 谢谢
我有一个模式,并使用.xsd生成了模型代码。现在我在从XML文件中读取数据时遇到了问题。通常的做法是从XML模式开始,然后使用它生成EMF模型,然后生成Java代码。这是在中描述的 您不需要实现读/写方法。而是使用EMF库代码来进行XML导入和导出。我现在没有我的EMF书的副本在我面前,但是它在那里被覆盖。或者,看看在加载或保存模型实例时生成的EMF编辑器会做什么 编辑 这是我几年前开发的一个基于EMF的项目的一个示例。查看
load*
方法。请注意,这不一定是最好的方式做到这一点。。。但这对我很管用
编辑2
我刚刚意识到我使用的是XMI而不是纯XML。使用自定义模式和(可能)自定义模式映射配置XML读取器可能会有所不同。那么,回到我的原始答案,看看生成的代码 EMF不是为读取任意XML文件而设计的。EMF使用XML作为后端。您的XML文件来自哪里/它们符合哪个模式?如果您有这个模式,那么您可以使用它来创建一个EMF模型,而EMF模型有望读取您的XML文件 否则,您将不得不对一个EMF模型进行反向工程,该模型将真正序列化为XML,以便您能够读取它,但这将是一个黑客行为 更新后2: 我想接下来的问题是“加载文件时有什么问题?”。你是怎么做的,什么不起作用?或者你不知道怎么做 首先必须为资源集(要使用的文件集的内存表示形式)配置工厂,然后使用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);
这些都应该包含在您已经有链接的教程中。然后,您可以使用生成的JavaAPI从“根”开始工作
虽然我没有ORM方面的经验,但也许你应该看看。EMF使用(默认的、最流行的方式)XMIResourceImpl序列化数据模型,XMIResourceImpl严格使用XMI格式,而不是自定义XML结构 有关EMF及其用例的文章,请参阅 我同意其他的回答,EMF可能不是你想要的 如果我真的想将EMF与自定义XML结构(即不是XMI)一起使用,我可能会使用JAXB来封送/解封我的EMF对象(EObjects) 因此,EMF与JAXB不同,它们有不同的目的和目标。事实上,您可能可以通过某种方式将EMF和JAXB结合起来。我从未尝试过,但似乎有一些有效的用例。(如上所述,用于将EMF对象封送到XML或从XML中封送/解封) 要理解EMF,您需要切换您的范例。首先,删除“XML”部分,让它从您的脑海中消失。那么我建议你做以下几点:
XMIResource resource = new XMIResourceImpl(URI.create("file:/path/to/mymodel.xmi"));
resource.load(null);
System.out.println( resource.eContents().get(0) );
您可以使用EMF读取任意XML文件,前提是您为它们提供了XSD,并且您甚至不必为它们生成Java类
// 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());
ResourceSet resourceSet = ResourceSetFactory.createResourceSet();
Resource resource = resourceSet.getResource(xmlURI, true);
resource.load(Collections.EMPTY_MAP);
EObject root = resource.getContents().get(0);