2009-02-10 41 views
2

我試圖從2002年(我知道.. ..)this article實現示例代碼,但無法獲取模式加載。使用org.eclipse.xsd和Maven2分析XML模式

import org.eclipse.emf.common.util.URI; 
import org.eclipse.emf.ecore.resource.Resource; 
import org.eclipse.emf.ecore.resource.ResourceSet; 
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; 
import org.eclipse.xsd.util.XSDResourceImpl; 

    ResourceSet resourceSet = new ResourceSetImpl(); 
    // I replaced the deprecated createDeviceURI with createURI as recommended in JavaDoc 
    XSDResourceImpl xsdSchemaResource = 
     (XSDResourceImpl)resourceSet.getResource(URI.createURI("my.xsd"), true); 

我用下面的Maven2依賴關係:

<dependency> 
    <groupId>org.eclipse.xsd</groupId> 
    <artifactId>xsd</artifactId> 
    <version>2.1.1</version> 
</dependency> 
<dependency> 
    <groupId>org.eclipse.emf</groupId> 
    <artifactId>ecore</artifactId> 
    <version>2.1.0</version> 
</dependency> 
<dependency> 
    <groupId>org.eclipse.emf</groupId> 
    <artifactId>common</artifactId> 
    <version>2.1.0</version> 
</dependency> 

代碼編譯得很好,但在執行時會產生一個RuntimeException:

java.lang.RuntimeException: 
    Cannot create a resource for 'my.xsd'; a registered resource factory is needed 
    at org.eclipse.emf.ecore.resource.impl.ResourceSetImpl.getResource(ResourceSetImpl.java:346) 

我發現了一些資源工廠實現在org.eclipse.emf.ecore.xmi中,但AFAIK在公共Maven回購中只有一個xmi snapshot,它具有對org.eclipse.core.runtime的依賴關係。這是不是我想要什麼。

任何人都可以幫忙嗎?

回答

2

嘗試創建ResourceSetImpl之前添加以下代碼:

import org.eclipse.xsd.util.XSDResourceFactoryImpl; 

Resource.Factory.Registry reg = Resource.Factory.Registry.INSTANCE; 
java.util.Map m = reg.getExtensionToFactoryMap(); 
m.put("xsd", new XSDResourceFactoryImpl()); 

這應該創建一個你需要完成你正在嘗試做的註冊表和工廠。

+0

感謝Keith,那就是我一直在尋找的!當然,我本應該在util中找到XSDResourceFactoryImpl,但我完全不熟悉eclipse代碼庫。 – 2009-02-11 09:48:44