Ошибки при формировании JAXP-схемы (javax.xml.validation.Schema) - PullRequest
0 голосов
/ 28 января 2009

Мы используем 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 делает аналогичные вещи для других файлов, почти точно так же, и все они работают нормально. Есть идеи, почему именно этот может давать ошибки?

1 Ответ

0 голосов
/ 26 мая 2009

Имеет ли источник, который вы создаете из java.util.jar.JarFile # getInputStream (JarEntry), базовый URL-адрес, так что относительные URL-адреса в ваших схемах могут быть разрешены и все ваши схемы находятся в одном и том же JAR-файле?

Вы пытались сделать это в файловой системе? Если он работает из файловой системы или с разнесенным путем к классам, попробуйте обратиться к моему ответу на другой вопрос, чтобы узнать подробнее о том, как заставить его работать изнутри JAR.

...