Предполагая, что вы работаете с JAXP, вы можете setSchema()
на SAXParserFactory
или `DocumentBuilderFactory.
Одним из решений, частью которого я был, было чтение всех источников XSD в агрегированный Schema
объект с использованием SchemaFactory.newSchema(Source[] schemas)
. Затем эта агрегированная схема смогла проверить любой документ XML, который ссылается на любую «верхнюю» схему; все imported
схемы должны были быть частью агрегированной схемы. Насколько я помню, необходимо было упорядочить исходный массив по зависимости, чтобы, если схема A импортировала схему B, схема B должна была появиться до схемы A в массиве.
Также, насколько я помню, <include>
не очень хорошо работал с этим механизмом.
Другим решением было бы установить LSResourceResolver
на ShemaFactory. Вы должны будете реализовать свой собственный LSResourceresolver
, который обслуживает байтовые или символьные потоки на основе ввода в распознаватель. Я лично не использовал и не исследовал это решение.
Первое решение, конечно, имеет то преимущество, что разбор и обработку схемы можно выполнить один раз и повторно использовать для всех последующих проверок; что-то, что, вероятно, будет трудно достичь со вторым вариантом.
Еще одна вещь, которую нужно иметь в виду (в зависимости от вашего контекста): Это хороший выбор дизайна, чтобы контролировать весь процесс «разрешения» (т.е. контролировать, как парсеры получают доступ к внешним ресурсам), как с точки зрения производительности, так и перспектива безопасности.