SAXParser не вызывает предупреждение для schema_reference.4: не удалось прочитать документ схемы

Я пытаюсь проверить XML, используя SAXParser. XML преднамеренно указывает на несуществующий документ схемы, но SAX не вызывает предупреждение, как я ожидал.

При проверке XML с использованием механизмов проверки Eclipse он правильно помечает файл предупреждением:

schema_reference.4: Failed to read schema document 'schema', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.

При выполнении тестового метода не печатается ни System.out, ни SAXException (или любой Exception, если уж на то пошло).

Метод испытаний

@Test
public void testSaxParser_missingSchema() throws ParserConfigurationException, SAXException, IOException {
  // Arrange
  final String resourcesFolder = "src/test/resources/XML_missing_schema.xml";

  // Act
  SAXParserFactory spf = SAXParserFactory.newInstance();
  spf.setNamespaceAware(true);
  SAXParser saxParser = spf.newSAXParser();
  XMLReader xmlReader = saxParser.getXMLReader();
  xmlReader.setErrorHandler(new LocalErrorHandler());
  xmlReader.parse(toBeValidated);  // does not throw anything, test passes
}

Класс LocalErrorHandler

class LocalErrorHandler implements ErrorHandler {

  @Override
  public void warning(SAXParseException exception) throws SAXException {
    System.out.println(exception);
    throw exception;
  }

  @Override
  public void error(SAXParseException exception) throws SAXException {
    System.out.println(exception);
    throw exception;
  }

  @Override
  public void fatalError(SAXParseException exception) throws SAXException {
    System.out.println(exception);
    throw exception;
  }
}

источник/тест/ресурсы/XML_missing_schema.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<Type xsi:schemaLocation="namespace schema"
  xmlns="namespace" xmlns:schemaNs="namespace/schemaNs"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
</Type>

Что я пробовал

  • Умышленное выбрасывание SAXParseException приводит к провалу теста.
  • Использование Known Implementing Classes в качестве ErrorHandler согласно https://docs.oracle.com/javase/8/docs/api/org/xml/sax/ErrorHandler.html. Ни один из них не обрабатывает предупреждения, и поэтому ничего не происходит.
  • Отсутствие вызова spf.setNamespaceAware(true); не имеет значения.

Окружающая среда

C:\eclipse\jdk8\bin>java.exe -version
openjdk version "1.8.0_265"
OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_265-b01)
OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.265-b01, mixed mode)
C:\eclipse>type .eclipseproduct
name=Eclipse Platform
id=org.eclipse.platform
version=4.15.0
<dependencies>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13</version>
    <scope>test</scope>
  </dependency>
</dependencies>

person MaxRumford    schedule 10.02.2021    source источник
comment
Это был отличный первый пост. Желаю, чтобы все было так же хорошо написано, как у вас.   -  person kjhughes    schedule 10.02.2021
comment
@kjhughes Спасибо :)   -  person MaxRumford    schedule 10.02.2021


Ответы (1)


Включите проверку XML-схемы, задав для ее функции значение true:

xmlReader.setFeature("http://apache.org/xml/features/validation/schema", true);

По умолчанию установлено значение false, поэтому без этого вызова проверка XSD не выполняется.

См. также

person kjhughes    schedule 10.02.2021