Ответ 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()
может или не может привести к остановке синтаксического анализа.