Проверка XML в Java: processContents = «lax» работает некорректно

У меня есть 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? Как я могу изменить его так, чтобы он вел себя так, как ожидалось?

5
задан Philipp Wendler 19 October 2011 в 11:42
поделиться