這個東西比較有趣,代碼還要區分是否在Eclipse環境下運行。
先看看現象,以EMF例子Library.ecore為例, 測試代碼如下:

public?class?Test?
{

????public?static?void?main(String[]?args)?throws?IOException?
{
????????ResourceSet?rs?=?new?ResourceSetImpl();
????????rs.getResourceFactoryRegistry().getExtensionToFactoryMap().put(
????????????????Resource.Factory.Registry.DEFAULT_EXTENSION,
????????????????new?XMIResourceFactoryImpl()); //outside eclipse
????????Resource?resource?=?rs.createResource(URI
????????????????.createURI(EXTLibraryPackage.eNS_URI));
????????//step?a
????????Library?library?=?EXTLibraryFactory.eINSTANCE.createLibrary();
????????library.setName("some?lib");
????????resource.getContents().add(library);
????????//step?b
//????????Book?book?=?EXTLibraryFactory.eINSTANCE.createBook();
//????????book.setTitle("some?book");
//????????Employee?employee?=?EXTLibraryFactory.eINSTANCE.createEmployee();
//????????employee.setFirstName("some?one");
????????//step?c
//????????library.getBooks().add(book);
//????????library.getEmployees().add(employee);
????????//step?d
//????????resource.getContents().add(book);
????
//????????System.out.println(EcoreUtil.getURI(employee));
//????????System.out.println(EcoreUtil.getURI(book));
????????resource.save(System.out,?null);
????}
}

可以看到,沒有加入lib的時候,employee/book實例的URI都是#//, employee加入以后有了#//@employees.0, book依舊。
在book加入resource以后有了#/1的URI, employee/book在containment定義分別是true,false,所以employee加入lib以后就隨lib加入resource(實例容器)。book則要單獨加入。
另外一個有趣的現象是Resource可以容納多個實例,在step d可以看到輸出的根節點由lib變成匿名容器。
如果lib不加入resource又如何呢?
沒加入resource之前,URI是未知的,知道的只是相對父節點的相對segment.
先看看現象,以EMF例子Library.ecore為例, 測試代碼如下:

































步驟 | 輸出 |
---|---|
a | ---------------- <?xml version="1.0" encoding="ASCII"?> <extlib:Library xmi:version="2.0" xmlns:xmi="http:///org/eclipse/emf/examples/library/extlibrary.ecore/1.0.0" name="some lib"/> |
b? | #// #// <?xml version="1.0" encoding="ASCII"?> <extlib:Library xmi:version="2.0" xmlns:xmi="http:///org/eclipse/emf/examples/library/extlibrary.ecore/1.0.0" name="some lib"/> |
c | http:///org/eclipse/emf/examples/library/extlibrary.ecore/1.0.0#//@employees.0 #// <?xml version="1.0" encoding="ASCII"?> <extlib:Library xmi:version="2.0" xmlns:xmi="http:///org/eclipse/emf/examples/library/extlibrary.ecore/1.0.0" name="some lib"> ? <employees firstName="some one"/> </extlib:Library> |
d | http:///org/eclipse/emf/examples/library/extlibrary.ecore/1.0.0#/0/@employees.0 http:///org/eclipse/emf/examples/library/extlibrary.ecore/1.0.0#/1 <?xml version="1.0" encoding="ASCII"?> <xmi:XMI xmi:version="2.0" xmlns:xmi="http:///org/eclipse/emf/examples/library/extlibrary.ecore/1.0.0"> ? <extlib:Library name="some lib"> ??? <employees firstName="some one"/> ? </extlib:Library> ? <extlib:Book title="some book"/> </xmi:XMI> |
可以看到,沒有加入lib的時候,employee/book實例的URI都是#//, employee加入以后有了#//@employees.0, book依舊。
在book加入resource以后有了#/1的URI, employee/book在containment定義分別是true,false,所以employee加入lib以后就隨lib加入resource(實例容器)。book則要單獨加入。
另外一個有趣的現象是Resource可以容納多個實例,在step d可以看到輸出的根節點由lib變成匿名容器。
如果lib不加入resource又如何呢?
步驟 | 輸出 |
---|---|
a | ---------------- |
b? | #// #// |
c | #///@employees.0 #// |
d | ---------------- |
http:///org/eclipse/emf/examples/library/extlibrary.ecore/1.0.0#/1
<?xml version="1.0" encoding="ASCII"?>
<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:extlib="http:///org/eclipse/emf/examples/library/extlibrary.ecore/1.0.0">
<extlib:Library name="some lib">
<employees firstName="some one"/>
</extlib:Library>
<extlib:Book title="some book"/>
</xmi:XMI>
對于上面這個例子,URI可否根據名字指定,例如,指定firstName來選擇,而不是employees.0 或者 employees.1