Я пытаюсь реализовать пользовательское исключение при проверке XML
против XSD
, чтобы вернуть номер строки и элемент ошибки.
Однако, когда я генерирую свое собственное исключение в моем обработчике ошибок, SAXException
генерируется с моим исключением, содержащимся в сообщении, а не с моей пользовательской ошибкой.
Когда мой CustomXMLValidationException
добавлен в CustomErrorHandler
- я бы хотел, чтобы его поймали в validateXml()
:
public static String validateXml(InputStream inputXml) throws XMLStreamException {
try {
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
javax.xml.validation.Validator validator = factory.newSchema(getXSD()).newValidator();
XMLStreamReader reader = XMLInputFactory.newFactory().createXMLStreamReader(inputXml);
validator.setErrorHandler(new CustomErrorHandler(reader));
validator.validate(new StAXSource(reader));
} catch (CustomXmlValidationException e) {
return prepareValidationErrorMessageWithLineNo(e.getLineNo(), e.getMessage(), e.getElement());
} catch (IOException | URISyntaxException | SAXException e) {
return String.format("Validation error: ", e.getMessage());
}
return null;
}
Вот CustomErrorHandler
:
public class CustomErrorHandler implements ErrorHandler {
private boolean isValid = true;
public boolean isValid() {
return this.isValid;
}
private XMLStreamReader reader;
public CustomErrorHandler(XMLStreamReader reader) {
this.reader = reader;
}
@Override
public void error(SAXParseException exc) throws SAXException {
throw new CustomXmlValidationException(exc.getMessage(), exc.getLineNumber(), reader.getLocalName());
}
@Override
public void fatalError(SAXParseException exc) {
}
@Override
public void warning(SAXParseException e) {
}
А CustomXmlValidationException
:
public class CustomXmlValidationException extends RuntimeException {
int lineNo;
String element;
public CustomXmlValidationException(String message, int lineNo, String element) {
super(message);
this.lineNo = lineNo;
this.element = element;
}
public int getLineNo() {
return this.lineNo;
}
public String getElement() {
return element;
}
}