這個(gè)東西比較有趣,代碼還要區(qū)分是否在Eclipse環(huán)境下運(yùn)行。
先看看現(xiàn)象,以EMF例子Library.ecore為例, 測(cè)試代碼如下:

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

































步驟 | 輸出 |
---|---|
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的時(shí)候,employee/book實(shí)例的URI都是#//, employee加入以后有了#//@employees.0, book依舊。
在book加入resource以后有了#/1的URI, employee/book在containment定義分別是true,false,所以employee加入lib以后就隨lib加入resource(實(shí)例容器)。book則要單獨(dú)加入。
另外一個(gè)有趣的現(xiàn)象是Resource可以容納多個(gè)實(shí)例,在step d可以看到輸出的根節(jié)點(diǎn)由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>
對(duì)于上面這個(gè)例子,URI可否根據(jù)名字指定,例如,指定firstName來選擇,而不是employees.0 或者 employees.1