Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用EMF读取XML文件?_Java_Xml_Eclipse_Eclipse Emf - Fatal编程技术网

Java 如何使用EMF读取XML文件?

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项目 谢谢

EMF=Eclipse建模框架

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

  • 阅读XML
  • 将值放入对象中
  • 使用ORM将对象中的值持久化到数据库中。-完成
  • 使用ORM从数据库获取数据并生成XML
  • 我需要使用:EMF(不知道曾经发生过什么)和JPA(DONE)来完成所有这些

    我使用过JAXB,我知道,这可以通过JAXB来实现,但是(EMF==JAXB)是如何实现的呢

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

    谢谢

    更新1 暗示

    更新2


    我有一个模式,并使用.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”部分,让它从您的脑海中消失。那么我建议你做以下几点:

  • 创建一个空的EMF项目
  • 创建一个简单的Ecore文件(.Ecore),或从Internet获取它。或者从任何XML模式/UML文件导入到Ecore模型中
  • 右键单击一个电子课堂,然后“创建动态实例”,这将创建一个.xmi文件
  • 使用Eclipse打开.xmi文件,这将打开该模型的EMF编辑器。根据需要进行编辑
  • 检查(已编辑的).xmi文件的内容。您将看到格式完全符合Ecore模型。您将无法更改/自定义模型XMI文件中的映射,因为顾名思义,XMIResourceImpl只读取/保存XMI文件(这恰好是在XML之上实现的),而不读取/保存任意XML格式
  • EMF支持读取/写入XML模式元模型(即XSD文件),以便将其转换为Ecore元模型,但不支持符合此类模式(甚至不支持Ecore)的XML文件,除非这些文件采用XMI格式

    有关将EMF模型持久化到关系数据库的信息,请参见:

    我用的是Teneo。(可选地,CDO)

    关于“XML”,如果您坚持使用XMI并对其感到满意,EMF将使您的生活变得更加轻松,因为您不需要进行任何映射(与JAXB不同)。缺点是我们的对象必须是EMF对象

    EMF对象是由EMF生成并实现EOObject并直接或间接扩展EOObjectImpl的对象。您通常不想手工编写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) );
    

    您可以使用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);