来看看ResourceSet.createResource(URI):Resource方法,从URI到Resource的过程如下:
1. getResourceFactoryRegistry()
  public Resource.Factory.Registry getResourceFactoryRegistry()
  
{
    
if (resourceFactoryRegistry == null)
    
{//可以自行Set一个注册表实现,没有的话用系统缺省注册表
      resourceFactoryRegistry =
        
new ResourceFactoryRegistryImpl()
        
{
          
public Resource.Factory delegatedGetFactory(URI uri)
          
{
            
return Resource.Factory.Registry.INSTANCE.getFactory(uri);
          }

        }
//代理系统注册表,注意这个应该是正宗的。
    }

    
return resourceFactoryRegistry;
  }

所以自己new 出来的ResourceSet可以向注册表中任意添加工厂实现。
2. 调用注册表的getFactory(URI), 实现如下:
 public Resource.Factory getFactory(URI uri)
  
{
    String protocol 
= uri.scheme();
    Object resourceFactory 
=  protocolToFactoryMap.get(protocol); //先根据protocol查找
    if (resourceFactory == null)
    
{
      String extension 
= uri.fileExtension();
      resourceFactory 
= extensionToFactoryMap.get(extension); //找不到再根据扩展名查找
      if (resourceFactory == null)
      
{
        resourceFactory 
= extensionToFactoryMap.get("*"); //尝试查找缺省扩展
        if (resourceFactory == null)
        
{
          resourceFactory 
= delegatedGetFactory(uri); //自行实现可以扩展此方法解析。
        }

      }

    }


    
//Descriptor可以用于编程使用
    return 
      resourceFactory 
instanceof Resource.Factory.Descriptor ?
        ((Resource.Factory.Descriptor)resourceFactory).createFactory() :
        (Resource.Factory)resourceFactory;
  }

查找一个工厂居然这么复杂!正因为这么复杂,才能支持platform/file/fttp等众多千奇百怪的URI
不同类型的工厂加工出不同类型的Resource, 才会输出为XSD/XML/XMI/....

如果直接操作系统注册表要小心。EMF中定义了几个扩展点,可以实现类似目的。
已知的ResourceFactory实现有:XSD/ECore/EMOF/XML/XMI,XSD的输出方法的介绍可以参考Eclipse Development using the Graphical Editing Framework and the Eclipse Modeling Framework电子书。