Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用org.eclipse.XSD.util.XSDResourceImpl读取XSD_Java_Xsd - Fatal编程技术网

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

Java 使用org.eclipse.XSD.util.XSDResourceImpl读取XSD,java,xsd,Java,Xsd,我使用org.eclipse.XSD.util.XSDResourceImpl成功地读取了XSD模式,并处理了所有包含的XSD元素、类型、属性等 但是,当我想要处理对导入模式中声明的元素的引用时,我会将null作为其类型。导入的架构似乎没有被XSDResourceImpl处理。 有什么想法吗 final XSDResourceImpl rsrc = new XSDResourceImpl(URI.createFileURI(xsdFileWithPath)); rsrc.load

我使用
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
更新:

我使导入的XSD无效,但没有异常。这意味着它实际上没有被解析。有没有办法强制将导入的XSD与主XSD一起加载?

您可以尝试类似的方法,手动解析类型:

final XSDResourceImpl rsrc = new XSDResourceImpl(URI.createFileURI(xsdFileWithPath));
rsrc.load(new HashMap());
final XSDSchema schema = rsrc.getSchema();
for (Object content : schema.getContents())
{
    if (content instanceof XSDImport)
    {
        XSDImport xsdImport = (XSDImport) content;
        xsdImport.resolveTypeDefinition(xsdImport.getNamespace(), "");
    }
}
你可以看看。特别是在这种方法中:

   private static void forceImport(XSDSchemaImpl schema) { 
        if (schema != null) { 
            for (XSDSchemaContent content: schema.getContents()) { 
                if (content instanceof XSDImportImpl) { 
                    XSDImportImpl importDirective = (XSDImportImpl)content; 
                    schema.resolveSchema(importDirective.getNamespace()); 
                } 
            } 
        } 
    } 

有一个重要的技巧可以自动处理
导入
包含
。您必须使用
ResourceSet
来读取主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();
然后,在处理图元、属性或模型组之前,必须使用:

elem = elem.getResolvedElementDeclaration();
attr = attr.getResolvedAttributeDeclaration();
grpdef = grpdef.getResolvedModelGroupDefinition();