我知道关于此主题有几个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“列表”的软件包。 (文件:/// C:/Users/2/My%20Repository/UNIT%20Research%20and%20Development/com.unitbilisim.research.transformation/model/List.xmi,6,40)在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)在com.unitbilisim.research.transformation.ConvertEcore2Graph.main(ConvertEcore2Graph.java:61)原因:org.eclipse.emf.ecore.xmi.PackageNotFoundException:找不到带有uri“列表”的软件包。 (文件:/// C:/Users/2/My%20Repository/UNIT%20Research%20and%20Development/com.unitbilisim.research.transformation/model/List.xmi,6,40)在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:719)在org.eclipse.emf.ecore.xmi.impl.XMIHandler.startElement(XMIHandler.java:163)在com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(未知来源)在com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.startElement(未知来源)在com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(未知来源)在com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl $ ContentDriver.scanRootElementHook(未知来源)在com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl $ FragmentContentDriver.next(未知来源)在com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl $ PrologDriver.next(未知来源)在com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(未知来源)在com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(未知来源)在com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(未知来源)在com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(未知来源)在com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(未知来源)在com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(未知来源)在com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl $ JAXPSAXParser.parse中(未知来源)在com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(未知来源)在org.eclipse.emf.ecore.xmi.impl.XMLLoadImpl.load(XMLLoadImpl.java:175)在org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl.doLoad(XMLResourceImpl.java:261)在org.eclipse.emf.ecore.resource.impl.ResourceImpl.load(ResourceImpl.java:1518)在org.eclipse.emf.ecore.resource.impl.ResourceImpl.load(ResourceImpl.java:1297)在org.eclipse.emf.ecore.resource.impl.ResourceSetImpl.demandLoad(ResourceSetImpl.java:259)在org.eclipse.emf.ecore.resource.impl.ResourceSetImpl.demandLoadHelper(ResourceSetImpl.java:274)...另外2个
'带有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。再次:(
请帮助
亲切的问候
原因是,我没有生成模型代码。因此,找不到“列表”包。我确实将它添加到我的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);
您应使用URI.createFileURI(uri)而不是URI.createURI(uri)。另外,您的模型实例(在您的情况下是List.xmi文件)必须具有xsi:schemaLocation属性,该属性具有指向您的元模型的相对路径,以避免预先注册元模型包。
val extensionMap = Resource.Factory.Registry.INSTANCE.extensionToFactoryMap
extensionMap["ecore"] = XMIResourceFactoryImpl()
extensionMap["xmi"] = XMIResourceFactoryImpl()
val resourceSet = ResourceSetImpl()
// createFileURI method is able to locate metamodel by xsi:schemaLocation
val resource = resourceSet.getResource(URI.createFileURI(modelPath), true)
resource.allContents.forEach { eObj ->
//do smth
}
要预先注册动态EPackage,请参考eclipse wiki