2011-01-09 55 views
0

我正在写一些eclipse emf代码,并希望打印一个EObject的内容(不将其存储到磁盘)。打印一个EObject?

这里是我的尝试:

public static void print(EObject obj) { 
    Resource eResource = obj.eResource(); 
    try { 
     eResource.save(System.out, null); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    } 

但给出了一个NullPointerException异常。我曾经尝试这样做,而不是:

public static void print(EObject obj) { 
    ResourceSet resourceSet = new ResourceSetImpl(); 
    resourceSet.getResourceFactoryRegistry().getProtocolToFactoryMap() 
     .put("*", new XMIResourceFactoryImpl()); 
    Resource resource = resourceSet.createResource(URI.createURI("dummyfile.xml")); 
    resource.getContents().add(obj); 
    try { 
     resource.save(System.out, null); 
    } catch (IOException ioe) { 
     ioe.printStackTrace(); 
    } 
    } 

这工作,但它是无法打印到屏幕,而无需指定虚拟URI?

回答

2

更新包括EcoreUtil.copy()

检查这个代码。

Resource res = new XMLResourceImpl(); 
res.getContents().add(EcoreUtil.copy(obj)); 
try { 
    resource.save(System.out, null); 
} catch (IOException ioe) { 
    ioe.printStackTrace(); 
} 

如果失败,那么是的,你需要一个虚拟的URI

Resource res = new XMLResourceImpl (URI.createURI("dummyfile.xml")); 
res.getContents().add(EcoreUtil.copy(obj)); 
try { 
    resource.save(System.out, null); 
} catch (IOException ioe) { 
    ioe.printStackTrace(); 
} 
+0

谢谢你的作品!只需要添加我的obj的副本,否则它在打印后不见了:res.getContents()。add(EcoreUtil.copy(obj)); – u123 2011-01-09 19:28:02

0

哼当我通过一个副本:

Resource res = new XMLResourceImpl(); 
res.getContents().add(ECoreUtil.copy(obj)); 
try { 
    resource.save(System.out, null); 
} catch (IOException ioe) { 
    ioe.printStackTrace(); 
} 

一些XMI属性不会被打印。但是,如果我多次调用上述方法并且不传递副本,我会得到一个NullPointerException。我想我不了解一些基本的EMF/Containment功能吗?

所以我更新的问题是:

是否可以打印完整EObject模型,而如果该模型是在下面的代码中使用修改的内容?