我知道关于这个问题有几个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‘列表’找不到。(file:///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) at org.eclipse.emf.ecore.resource.impl.ResourceSetImpl.demandLoadHelper(ResourceSetImpl.java:278) at org.eclipse.emf.ecore.resource.impl.ResourceSetImpl.getResource(ResourceSetImpl.java:406) at com.unitbilisim.research.transformation.ConvertEcore2Graph.main(ConvertEcore2Graph.java:61)引起的:没有找到uri 'List‘的org.eclipse.emf.ecore.xmi.PackageNotFoundException:包。(file:///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) 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) at org.eclipse.emf.ecore.xmi.impl.XMIHandler.startElement(XMIHandler.java:163) at( com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(Unknown来源)在com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.startElement(Unknown来源)在com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(Unknown源头)在com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$ContentDriver.scanRootElementHook(Unknown源头)在com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(未知源)在com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(Unknown源)在com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown源)在com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown源)在com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown源)在com.sun.org.apache.xerces.internal.parserscom.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown源( com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source),com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown源(com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source) ) org.eclipse.emf.ecore源( com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(Unknown Source)。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)在org.eclipse.emf.ecore.resource.impl.ResourceSetImpl.demandLoadHelper(ResourceSetImpl.java:274) .还有两个
“没有找到”是什么意思?我可以直接读取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。再一次:(
请帮帮忙
亲切问候
发布于 2014-11-17 12:20:25
原因是我没有生成模型代码。因此,无法找到“列表”包。我把它添加到了我的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);发布于 2019-09-25 18:36:29
您应该使用URI.createFileURI(absolutePathUri)而不是URI.createURI(uri).此外,您的模型实例(在您的示例中是List.xmi文件)必须具有与元模型相对路径的List.xmi属性,以避免预先注册元模型包。非常重要的一点:您的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的预注册参考月食维基
https://stackoverflow.com/questions/26944174
复制相似问题