2

我知道有几个关于这个主题的 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);

错误:

线程“主”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) 在 org.eclipse.emf.ecore.resource.impl.ResourceSetImpl.demandLoadHelper(ResourceSetImpl.java:278) 在 org.eclipse.emf.ecore.resource。 impl.ResourceSetImpl.getResource(ResourceSetImpl.java:406) at com.unitbilisim.research.transformation.ConvertEcore2Graph.main(ConvertEcore2Graph.java:61) 原因:org.eclipse.emf.ecore.xmi.PackageNotFoundException: Package with uri ' 未找到列表。(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) 在 org.eclipse.emf.ecore.xmi.impl.XMLHandler.getFactoryForPrefix(XMLHandler.java:2458) 在 org.eclipse.emf.ecore.xmi。 impl.XMLHandler.createObjectByType(XMLHandler.java:1335) 在 org.eclipse.emf.ecore.xmi.impl.XMLHandler.createTopObject(XMLHandler.java:1504) 在 org.eclipse.emf.ecore.xmi.impl.XMLHandler。 processElement(XMLHandler.java:1026) 在 org.eclipse.emf.ecore.xmi.impl.XMIHandler.processElement(XMIHandler.java:77) 在 org.eclipse.emf.ecore.xmi.impl.XMLHandler.startElement(XMLHandler. java:1008) 在 org.eclipse.emf.ecore.xmi.impl.XMLHandler.startElement(XMLHandler.java:

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

我也试过这个-> 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。再次 :(

请帮忙

亲切的问候

4

2 回答 2

1

The reason was, I did not generate the model codes. Because of that, 'List' package could not be found. I did add it to my packageRegistry and that's all.

        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);
于 2014-11-17T12:20:25.613 回答
0

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

Kotlin 语言示例:

    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

于 2019-09-25T18:36:29.010 回答