Есть ли способ создать объект схемы, используя схему XML, состоящую из циклических зависимостей? - PullRequest
2 голосов
/ 07 декабря 2011

Мне дали схему, которая содержит два файла .xsd, которые включают друг друга (a.xsd включает в себя b.xsd, b.xsd включает в себя a.xsd). Когда я запускаю их через мой код для возврата объекта Schema, я получаю исключение нехватки памяти.

Мой код выглядит следующим образом:

protected Schema createSchema(String fileName) throws Exception  {
  SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
  factory.setResourceResolver(resourceResolver);
  Resource schemaResource = resourceLoader.getResource(fileName);
  StreamSource streamSource = new StreamSource(schemaResource.getInputStream());
  Schema schema = factory.newSchema(streamSource);
  return schema;
}

Поправьте меня, если я не прав, factory.newSchema (streamSource) использует include, а также import для загрузки источников в память. И поскольку эти два xsd включают друг друга, они загружаются снова и снова, заполняя пространство памяти. Есть ли способ вырваться из этого цикла и загрузить оставшуюся часть схемы БЕЗ изменения схемы схемы?

1 Ответ

0 голосов
/ 08 декабря 2011

У меня сложилось впечатление, что большинство процессоров схемы могут обрабатывать циклические включения: они никогда не нужны, но они должны быть безвредными. (Однако в этом вопросе спецификация далеко не ясна.)

Поскольку вы используете какое-либо средство resourceResolver, возможно, процессор схемы не распознает, что URI включения указывает на документ, который он уже видел.

С другой стороны, использование resourceResolver может быть способом устранения округлостей, не возвращая ничего (или пустую схему xs:), когда документ схемы посещается во второй и последующий раз.

Вы на самом деле не говорите, какой процессор схемы вы используете: есть по крайней мере два процессора, которые реализуют API JAXP, который вы используете здесь - больше, чем если вы посчитаете разные форки Xerces.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...