从XMI文件加载EMF模型实例

时间:2014-11-15 08:50:58

标签: java model emf xmi ecore

我知道有关此主题的几个QnA。我尝试了很多解决方案,我总是得到同样的错误。

我的代码结构如下:

Resource.Factory.Registry reg = Resource.Factory.Registry.INSTANCE;
    Map<String, Object> m = reg.getExtensionToFactoryMap();
    m.put("xmi", new XMIResourceFactoryImpl());

    ResourceSet resSet = new ResourceSetImpl();
    Resource resource = resSet.getResource(URI.createURI("model/List.xmi"), true);
    resource.load(Collections.EMPTY_MAP);
    EObject root = resource.getContents().get(0);

错误:

  

线程“main”中的异常org.eclipse.emf.ecore.resource.impl.ResourceSetImpl $ 1DiagnosticWrappedException:org.eclipse.emf.ecore.xmi.PackageNotFoundException:找不到包含uri'List'的包。 (file:/// C:/Users/2/My%20Repository/UNIT%20Research%20and%20Development/com.unitbilisim.research.transformation/model/List.xmi,6,40)       at org.eclipse.emf.ecore.resource.impl.ResourceSetImpl.handleDemandLoadException(ResourceSetImpl.java:319)       at org.eclipse.emf.ecore.resource.impl.ResourceSetImpl.demandLoadHelper(ResourceSetImpl.java:278)       at org.eclipse.emf.ecore.resource.impl.ResourceSetImpl.getResource(ResourceSetImpl.java:406)       在com.unitbilisim.research.transformation.ConvertEcore2Graph.main(ConvertEcore2Graph.java:61)   引起:org.eclipse.emf.ecore.xmi.PackageNotFoundException:找不到包含uri'List'的包。 (file:/// C:/Users/2/My%20Repository/UNIT%20Research%20and%20Development/com.unitbilisim.research.transformation/model/List.xmi,6,40)       at org.eclipse.emf.ecore.xmi.impl.XMLHandler.getPackageForURI(XMLHandler.java:2625)       at org.eclipse.emf.ecore.xmi.impl.XMLHandler.getFactoryForPrefix(XMLHandler.java:2458)       at org.eclipse.emf.ecore.xmi.impl.XMLHandler.createObjectByType(XMLHandler.java:1335)       at org.eclipse.emf.ecore.xmi.impl.XMLHandler.createTopObject(XMLHandler.java:1504)       at org.eclipse.emf.ecore.xmi.impl.XMLHandler.processElement(XMLHandler.java:1026)       at org.eclipse.emf.ecore.xmi.impl.XMIHandler.processElement(XMIHandler.java:77)       at org.eclipse.emf.ecore.xmi.impl.XMLHandler.startElement(XMLHandler.java:1008)       at org.eclipse.emf.ecore.xmi.impl.XMLHandler.startElement(XMLHandler.java:719)       在org.eclipse.emf.ecore.xmi.impl.XMIHandler.startElement(XMIHandler.java:163)       at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(Unknown Source)       at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.startElement(Unknown Source)       at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(Unknown Source)       at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl $ ContentDriver.scanRootElementHook(Unknown Source)       at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl $ FragmentContentDriver.next(Unknown Source)       at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl $ PrologDriver.next(Unknown Source)       at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)       at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)       at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)       at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)       在com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(未知来源)       at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)       at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl $ JAXPSAXParser.parse(Unknown Source)       at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(Unknown Source)       at org.eclipse.emf.ecore.xmi.impl.XMLLoadImpl.load(XMLLoadImpl.java:175)       at org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl.doLoad(XMLResourceImpl.java:261)       at org.eclipse.emf.ecore.resource.impl.ResourceImpl.load(ResourceImpl.java:1518)       at org.eclipse.emf.ecore.resource.impl.ResourceImpl.load(ResourceImpl.java:1297)       at org.eclipse.emf.ecore.resource.impl.ResourceSetImpl.demandLoad(ResourceSetImpl.java:259)       at org.eclipse.emf.ecore.resource.impl.ResourceSetImpl.demandLoadHelper(ResourceSetImpl.java:274)       ......还有2个

“找不到uri包”是什么意思?我可以直接读取xmi文件,还是需要将其解析为xml文件?

我也试过这个 - &gt; https://stackoverflow.com/a/4615965/1604503

    XMIResource resource = new XMIResourceImpl(URI.createURI("model/List.xmi"));
    resource.load(null);
    System.out.println( resource.getContents().get(0) );

PackageNotFoundEx。和Reource $ IOWrappedEx。再次:(

请帮忙

亲切的问候

2 个答案:

答案 0 :(得分:1)

原因是,我没有生成模型代码。因此,找不到“列表”包。我确实将它添加到我的packageRegistry中,就是这样。

        ResourceSet resourceSet = new ResourceSetImpl();

        // register UML
        Map packageRegistry = resourceSet.getPackageRegistry();
        packageRegistry.put(list.ListPackage.eNS_URI, list.ListPackage.eINSTANCE);

        // Register XML resource as UMLResource.Factory.Instance
        Map extensionFactoryMap = Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap();
        extensionFactoryMap.put("xmi", new XMIResourceFactoryImpl());

        Resource resource = (Resource) resourceSet.createResource(uri);


        // try to load the file into resource
        resource.load(null);

答案 1 :(得分:0)

您应该使用 URI.createFileURI(absolutePathUri)而不是 URI.createURI(uri)。 另外,您的模型实例(在您的情况下,它是List.xmi文件)必须具有 xsi:schemaLocation 属性,该属性具有指向您的元模型的相对路径,以避免预先注册元模型包。非常重要的注意事项:您的uri参数必须从模型的绝对路径构建

科特林语示例:

    Resource.Factory.Registry.INSTANCE.extensionToFactoryMap.apply {
        put("ecore", EcoreResourceFactoryImpl())
        put("xmi", XMIResourceFactoryImpl())
    }

    val resourceSet = ResourceSetImpl()

    // createFileURI method is able to locate metamodel by xsi:schemaLocation
    // absolute path is important here !!!
    val resource = resourceSet.getResource(URI.createFileURI(File(modelPath).absolutePath), true)
    resource.allContents.forEach { eObj ->
        //do smth
    }

要预先注册动态EPackage,请参考eclipse wiki