我们正在使用JAXB 2.x从大型模式系统(42个XSD文件)生成数据对象。整个过程运行良好,没有问题。但是他们不赞成(并从实现中删除)整个JAXB验证框架,而是将其替换为JAXP验证框架。 (这都位于javax.xml.validation
包中。)
我将依赖顺序给出的所有文件都发送到javax.xml.validation.SchemaFactory
,并验证它们的顺序是否正确。问题是一个文件产生的错误是不知道另一个文件中定义的命名空间的引用。它基本上就像导入失败一样。 (我不完全确定,因为根据XML Schema规范,导入失败不是错误。因此我无法验证导入是否失败;它不会产生警告或错误。这不会让您大吃一惊吗?)我知道发生了什么文件,因为如果我注释掉一个引用,它就会停止抱怨。这是基本代码:
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[]{}));
错误处理程序给出的唯一错误是指示未找到引用的错误。以下是相关文件的XSD依赖关系列表:
xsds/import/foo/thing.xsd (<xsd:element name="thing">...</xsd:element>)
xsds/import/foo/otherthing.xsd (<xsd:include schemaLocation="thing.xsd"/>)
xsds/import/foo/all.xsd (<xsd:include schemaLocation="otherthing.xsd"/>)
xsds/mystuff/main.xsd (<xsd:import namespace="foonamespace" schemaLocation="../import/foo/all.xsd/>)
main.xsd
文件包含这样的行,这会引发有关未知引用的错误:
<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)
main.xsd
对其他文件执行类似的操作,几乎完全相同,并且它们都可以正常工作。知道为什么这个特定的人会给出错误吗?
答案 0 :(得分:0)
您从java.util.jar.JarFile #getInputStream(JarEntry)创建的源是否具有基本URL,以便可以解析模式中的相对URL并且是同一JAR中的所有模式?< / p>
你试过在文件系统上做过吗?如果它适用于文件系统或展开的类路径,请尝试将我的answer引用到另一个问题,以获取有关如何使其在JAR内部工作的详细信息。