我们使用jaxb2.x从一个庞大的模式系统(42个XSD文件)生成数据对象。整个过程运行良好,没有问题。但他们不赞成(并从实现中删除)整个JAXB验证框架,取而代之的是JAXP验证框架(所有这些都位于
javax.xml.validation
包装。)
javax.xml.validation.SchemaFactory
import javax.xml.transform.Source;
final java.util.ArrayList<Source> xsdSources =
new java.util.ArrayList<Source>();
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[]{}));
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)
主.xsd
以几乎完全相同的方式对其他文件执行类似的操作,并且它们都可以正常工作。你知道为什么这个会出错吗?