形成JAXP模式(javax.xml.validation.Schema)时出错

形成JAXP模式(javax.xml.validation.Schema)时出错,java,xml,validation,xsd,Java,Xml,Validation,Xsd,我们使用jaxb2.x从大量模式系统42xsd文件生成数据对象。整个过程运行良好,没有问题。但他们不赞成并从实现中删除了整个JAXB验证框架,取而代之的是JAXP验证框架。这些都位于javax.xml.validation包中 我已将所有文件按依赖顺序提供给javax.xml.validation.SchemaFactory,并已验证它们的顺序是否正确。问题是,一个文件正在生成有关不知道来自另一个文件中定义的命名空间的引用的错误。它基本上表现为进口失败。我不完全确定,因为根据XML模式规范,导入

我们使用jaxb2.x从大量模式系统42xsd文件生成数据对象。整个过程运行良好,没有问题。但他们不赞成并从实现中删除了整个JAXB验证框架,取而代之的是JAXP验证框架。这些都位于javax.xml.validation包中

我已将所有文件按依赖顺序提供给javax.xml.validation.SchemaFactory,并已验证它们的顺序是否正确。问题是,一个文件正在生成有关不知道来自另一个文件中定义的命名空间的引用的错误。它基本上表现为进口失败。我不完全确定,因为根据XML模式规范,导入失败不是错误。因此,我无法验证导入是否失败;它不会生成警告或错误。这不是让你大吃一惊吗?我知道这发生在哪个文件中,因为如果我注释掉一个引用,它就不会抱怨了。以下是基本代码:

import javax.xml.transform.Source;

final java.util.ArrayList<Source> xsdSources =
    new java.util.ArrayList<Source>();
/* POPULATE THE LIST WITH ALL THE XSDS IN DEPENDENCY ORDER.
   THAT IS, FILES WITH NO DEPENDENCIES APPEAR IN LOWER INDEX.
   I USE javax.xml.transform.stream.StreamSource, GIVING IT
   STREAMS FROM java.util.jar.JarFile#getInputStream(JarEntry). */

final javax.xml.validation.SchemaFactory schemaFactory =
    javax.xml.validation.SchemaFactory.newInstance(
        javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI);
schemaFactory.setErrorHandler(new SchemaErrorHandler());
return schemaFactory.newSchema(xsdSources.toArray(new Source[]{}));
错误和堆栈跟踪如下所示:

org.xml.sax.SAXParseException: src-resolve: Cannot resolve the name 'foo:thing' to a(n) 'element declaration' component.
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:131)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:384)
    at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.reportSchemaErr(XSDHandler.java:2537)
    at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.reportSchemaError(XSDHandler.java:2528)
    at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.getGlobalDecl(XSDHandler.java:1472)
    at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDElementTraverser.traverseLocal(XSDElementTraverser.java:160)
    at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.traverseLocalElements(XSDHandler.java:2049)
    at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.parseSchema(XSDHandler.java:582)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadSchema(XMLSchemaLoader.java:552)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadGrammar(XMLSchemaLoader.java:519)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadGrammar(XMLSchemaLoader.java:485)
    at com.sun.org.apache.xerces.internal.jaxp.validation.XMLSchemaFactory.newSchema(XMLSchemaFactory.java:210)

main.xsd以几乎完全相同的方式对其他文件执行类似的操作,并且它们都可以正常工作。你知道为什么这个特定的会出现错误吗?

从java.util.jar.JarFilegetInputStreamJarEntry创建的源是否有一个基本URL,以便可以解析模式中的相对URL,并且所有模式都在同一个jar中


你试过在文件系统上做吗?如果它可以从文件系统或分解的类路径中工作,请尝试参考my to另一个问题,了解有关如何从JAR内部工作的详细信息。

它可以用于其他文件,所有文件的访问方式都完全相同。所以我不认为这是URL和文件系统的问题。死而复生。。。我看到您正在使用包含和导入。XSD中使用includes的目标名称空间是否相同?另外,最好在捆绑的Xerces代码中插入一个断点,看看到底发生了什么。您是否尝试过使用XSV或其他第三方工具验证模式?
<xsd:element xmlns:foo="foonamespace" ref="foo:thing"/>
org.xml.sax.SAXParseException: src-resolve: Cannot resolve the name 'foo:thing' to a(n) 'element declaration' component.
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:131)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:384)
    at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.reportSchemaErr(XSDHandler.java:2537)
    at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.reportSchemaError(XSDHandler.java:2528)
    at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.getGlobalDecl(XSDHandler.java:1472)
    at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDElementTraverser.traverseLocal(XSDElementTraverser.java:160)
    at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.traverseLocalElements(XSDHandler.java:2049)
    at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.parseSchema(XSDHandler.java:582)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadSchema(XMLSchemaLoader.java:552)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadGrammar(XMLSchemaLoader.java:519)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadGrammar(XMLSchemaLoader.java:485)
    at com.sun.org.apache.xerces.internal.jaxp.validation.XMLSchemaFactory.newSchema(XMLSchemaFactory.java:210)