Хммм, просто прочитайте свой «комментарий» - редактирование не предупреждает людей о новых ответах, поэтому самое время спросить своего начальника о каком-либо iPhone или каком-либо другом гаджете, который напрямую подключен к сети;
Ну, я полагаю, вы добавили:
schemas.add(
new StreamSource(AtomValidator.class.getResourceAsStream("/xml.xsd")));
Если это так, то действительно ли xml.xsd
можно найти на пути к классам? Интересно, если бы getResourceAsStream
не принесло null
в вашем случае, и как бы тогда действовал new StreamSource(null)
?
Даже если getResourceAsStream
не даст null
, полученный StreamSource
все равно не будет знать, откуда он был загружен, что может быть проблемой при попытке включить ссылки. Итак, что если вы используете вместо этого конструктор StreamSource (String systemId) :
schemas.add(new StreamSource(AtomValidator.class.getResource("/atom.xsd")));
schemas.add(new StreamSource(AtomValidator.class.getResource("/dc.xsd")));
Вы также можете использовать StreamSource (InputStream inputStream, String systemId) , но я не вижу никаких преимуществ перед двумя вышеупомянутыми строками. Тем не менее, документация объясняет, почему передача systemId в любом из двух конструкторов кажется хорошей:
Этот конструктор позволяет устанавливать systemID в дополнение к входному потоку, что позволяет обрабатывать относительные URI.
Аналогично, setSystemId (String systemId) объясняет немного:
Системный идентификатор является необязательным, если имеется поток байтов или поток символов, но его все равно полезно предоставить, поскольку приложение может использовать его для разрешения относительных URI и может включать его в сообщения об ошибках и предупреждения (анализатор) будет пытаться открыть соединение с URI, только если не указан ни байтовый поток, ни символьный поток).
Если это не сработает, возможно, какой-то пользовательский обработчик ошибок может дать вам более подробную информацию:
ErrorHandlerImpl errorHandler = new ErrorHandlerImpl();
validator.setErrorHandler(errorHandler);
:
:
validator.validate(source);
if(errorHandler.hasErrors()){
LOG.error(errorHandler.getMessages());
throw new [..];
}
if(errorHandler.hasWarnings()){
LOG.warn(errorHandler.getMessages());
}
... используя следующий ErrorHandler для захвата ошибок проверки и продолжения анализа, насколько это возможно:
import org.xml.sax.helpers.DefaultHandler;
private class ErrorHandlerImpl extends DefaultHandler{
private String messages = "";
private boolean validationError = false;
private boolean validationWarning = false;
public void error(SAXParseException exception) throws SAXException{
messages += "Error: " + exception.getMessage() + "\n";
validationError = true;
}
public void fatalError(SAXParseException exception) throws SAXException{
messages += "Fatal: " + exception.getMessage();
validationError = true;
}
public void warning(SAXParseException exception) throws SAXException{
messages += "Warn: " + exception.getMessage();
validationWarning = true;
}
public boolean hasErrors(){
return validationError;
}
public boolean hasWarnings(){
return validationWarning;
}
public String getMessages(){
return messages;
}
}