使用org.eclipse.xsd和Maven2分析XML模式

时间:2009-02-10 18:37:02

标签: java xsd eclipse-emf

我正在尝试从2002年开始将示例代码实现到this article(我知道..),但是无法加载架构。

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。那是不是我想要的东西。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分: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());

这应该创建你需要完成你想要做的事情的注册表和工厂。