Подтвердить что ты не робот

Как проверить xml на xsd и получить * ВСЕ * ошибки?

У меня есть стандартный код, как показано ниже, для проверки xml против xsd, но он генерирует исключение при первой ошибке и останавливается. Как проверить xml, но продолжайте с первой и следующей ошибками и получите их все в конце? Возможно ли это?

public static void validate(File xml, InputStream xsd) {
    try {
        SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        Schema schema = factory.newSchema(new StreamSource(xsd));
        Validator validator = schema.newValidator();
        StreamSource xmlFile = new StreamSource(xml);
        validator.validate(xmlFile);

    } catch (SAXException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
4b9b3361

Ответ 1

Между Validator validator = schema.newValidator(); и StreamSource xmlFile = new StreamSource(xml); добавьте этот фрагмент:

  final List<SAXParseException> exceptions = new LinkedList<SAXParseException>();
  validator.setErrorHandler(new ErrorHandler()
  {
    @Override
    public void warning(SAXParseException exception) throws SAXException
    {
      exceptions.add(exception);
    }

    @Override
    public void fatalError(SAXParseException exception) throws SAXException
    {
      exceptions.add(exception);
    }

    @Override
    public void error(SAXParseException exception) throws SAXException
    {
      exceptions.add(exception);
    }
  });

Таким образом, после validate() вы получите полный список исключений, но если произойдет одна фатальная ошибка, синтаксический анализ остановится...

EDIT: JavaDoc говорит: приложение должно предположить, что документ непригоден после того, как парсер вызвал этот метод, и должен продолжить (если вообще) только для сбора дополнительных сообщений об ошибке: на самом деле Анализаторы SAX могут прекратить сообщать о любых других событиях после вызова этого метода. Поэтому fatalError() может или не может привести к остановке синтаксического анализа.