Множество хитов при поиске в SO или Google.Одним из них является этот вопрос, в котором автор нашел свое собственное решение и сообщает следующий код для добавления нескольких xsd в валидатор:
Schema schema = factory().newSchema(new Source[] {
new StreamSource(stream("foo.xsd")),
new StreamSource(stream("Alpha.xsd")),
new StreamSource(stream("Mercury.xsd")),
});
Однако при работе непосредственно с InputStream
on StreamSource
, распознаватель не может загрузить любые XSD-файлы, на которые есть ссылки.Например, если файл xsd1
импортирует или содержит третий файл (не xsd2
), создание схемы завершится неудачно.Вы должны либо установить системный идентификатор (setSystemId
), либо (что еще лучше) использовать конструктор StreamSource(File f)
.
С учетом вашего примера кода:
try {
schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
schema = schemaFactory.newSchema(new Source[] {
new StreamSource(xsd1), new StreamSource(xsd2)
});
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Примечание:
При работе с ресурсами classpath я бы предпочел конструктор StreamSource(String systemId)
(вместо создания File
):
new StreamSource(getClass().getClassLoader().getResource("a.xsd").toExternalForm());