使用org.eclipse.xsd.util.XSDResourceImpl读取XSD

Pav*_*nar 5 java xsd

我成功地使用org.eclipse.xsd.util.XSDResourceImpl并处理了所有包含的XSD元素,类型,属性等来读取XSD模式.
但是当我想处理对导入模式中声明的元素的引用时,我得到null它的类型.似乎导入的模式不会被处理XSDResourceImpl.任何的想法?

    final XSDResourceImpl rsrc = new XSDResourceImpl(URI.createFileURI(xsdFileWithPath));
    rsrc.load(new HashMap());
    final XSDSchema schema = rsrc.getSchema();
    ...
    if (elem.isElementDeclarationReference()){ //element ref
        elem = elem.getResolvedElementDeclaration();
    }
    XSDTypeDefinition tdef = elem.getType(); //null for element ref
Run Code Online (Sandbox Code Playgroud)

更新:
我使导入的XSD无效,但没有异常.这意味着它真的没有被解析.有没有办法强制加载导入的XSD和主要的XSD?

Pav*_*nar 1

有一个重要的技巧需要自动imports处理includes。您必须使用 aResourceSet来读取主 XSD 文件。

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.XSDResourceFactoryImpl;
import org.eclipse.xsd.util.XSDResourceImpl;
import org.eclipse.xsd.XSDSchema;

static ResourceSet resourceSet;
XSDResourceFactoryImpl rf = new XSDResourceFactoryImpl();
Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("xsd", rf);
resourceSet = new ResourceSetImpl();
resourceSet.getLoadOptions().put(XSDResourceImpl.XSD_TRACK_LOCATION, Boolean.TRUE);
XSDResourceImpl rsrc = (XSDResourceImpl)(resourceSet.getResource(uri, true));
XSDSchema sch = rsrc.getSchema();
Run Code Online (Sandbox Code Playgroud)

然后在处理元素、属性或模型组之前,您必须使用以下命令:

elem = elem.getResolvedElementDeclaration();
attr = attr.getResolvedAttributeDeclaration();
grpdef = grpdef.getResolvedModelGroupDefinition();
Run Code Online (Sandbox Code Playgroud)