Мы используем JAXB 2.x для генерации объектов данных из массивной системы схем (42 XSD-файла). Весь этот процесс работает нормально, никаких проблем нет. Но они устарели (и удалили из реализации) всю платформу проверки 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[]{}));
Единственные ошибки, выдаваемые обработчиком ошибок, это те, которые указывают, что ссылки не найдены. Вот как выглядит список зависимостей 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
делает аналогичные вещи для других файлов, почти точно так же, и все они работают нормально. Есть идеи, почему именно этот может давать ошибки?