У меня есть XML-схема, которая содержит несколько
определений, т.е. позволяет вставлять произвольные теги из других пространств имен . processContents = "lax"
указывает, что синтаксический анализатор должен попытаться проверить эти теги, если он имеет соответствующую схему (1) (2) .
Для меня это означает, что если я передаю синтаксическому анализатору все документы схемы, и есть недопустимый тег XML одного из вторичных пространств имен, он должен сообщить об ошибке.
Однако похоже, что валидатор Java XML игнорирует такие ошибки. Я проверил, что у парсера есть все необходимые документы схемы для выполнения проверки (если я изменю схему XML на processContents = "strict"
, она будет работать, как ожидалось, и будет использовать документы вторичной схемы для проверки). Кажется, что валидатор ведет себя так, как будто атрибут указан со значением skip
.
Код Java для проверки:
/*
* xmlDokument is the file name of the XML document
* xsdSchema is an array with all schema documents
*/
public static void validate( String xmlDokument, Source[] xsdSchema ) throws SAXException, IOException {
SchemaFactory schemaFactory = SchemaFactory.newInstance( XMLConstants.W3C_XML_SCHEMA_NS_URI );
Schema schema = schemaFactory.newSchema( xsdSchema );
Validator validator = schema.newValidator();
validator.setErrorHandler( new MyErrorHandler() );
validator.validate( new StreamSource(new File(xmlDokument)) );
}
Минимальный пример:
Первичная схема:
Вторичная схема:
XML-документ, который я пытаюсь проверить:
Используя приведенный выше код Java, документы схемы не вызывают никаких ошибок проверки, только если я изменю lax
на strict
в базовой схеме (что мне не нужно).Сообщение об ошибке в этом случае:
cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'secondary:invalidTag'.
Вопросы:
Я что-то неправильно понял, и действительно ли это правильное поведение? Или я прав относительно processContents
?
Правильно ли работают мои документы схемы?
Правильно ли мой код Java? Как я могу изменить его так, чтобы он вел себя так, как ожидалось?