Я проверяю объект DOM в памяти, используя класс javax.xml.validation.Validator
, против схемы XSD.Я получаю SAXParseException
, который выдается во время проверки всякий раз, когда в информации, из которой я заполняю свой DOM, происходит повреждение данных.
Пример ошибки:
org.xml.SAXParseException: cvc-datatype-valid.1.2.1: '??? "?? [????? G?> ??? p ~ tn ?? ~ 0? 1]' не является допустимым значением val для 'hexBinary'.
Я надеюсь, что есть способ найти местоположение этой ошибки в моем DOM в памяти и распечатать неисправный элемент и его родительский элемент. Мой текущий код:
public void writeDocumentToFile(Document document) throws XMLWriteException {
try {
// Validate the document against the schema
Validator validator = getSchema(xmlSchema).newValidator();
validator.validate(new DOMSource(document));
// Serialisation logic here.
} catch(SAXException e) {
throw new XMLWriteException(e); // This is being thrown
} // Some other exceptions caught here.
}
private Schema getSchema(URL schema) throws SAXException {
SchemaFactory schemaFactory =
SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
// Some logic here to specify a ResourceResolver
return schemaFactory.newSchema(schema);
}
Я изучил метод Validator#setErrorHandler(ErrorHandler handler)
, но интерфейс ErrorHandler
дает мне только экспозицию SAXParseException
, которая показывает только номер строки и номер столбца ошибки. Потому что я используюDOM в памяти возвращает -1 как для номера строки, так и для столбца.
Есть ли лучший способ сделать это? Я действительно не хочу вручную проверять строки, прежде чем добавить их вDOM, если библиотеки предоставляют мне функцию, которую я ищу.
Я использую обновление JDK 6e 26 и JDK 6 обновляют 7 в зависимости от того, где работает этот код.
РЕДАКТИРОВАТЬ: С этим добавленным кодом -
validator.setErrorHandler(new ErrorHandler() {
@Override
public void warning(SAXParseException exception) throws SAXException {
printException(exception);
throw exception;
}
@Override
public void error(SAXParseException exception) throws SAXException {
printException(exception);
throw exception;
}
@Override
public void fatalError(SAXParseException exception) throws SAXException {
printException(exception);
throw exception;
}
private void printException(SAXParseException exception) {
System.out.println("exception.getPublicId() = " + exception.getPublicId());
System.out.println("exception.getSystemId() = " + exception.getSystemId());
System.out.println("exception.getColumnNumber() = " + exception.getColumnNumber());
System.out.println("exception.getLineNumber() = " + exception.getLineNumber());
}
});
Я получаю вывод:
exception.getPublicId() = null
exception.getSystemId() = null
exception.getColumnNumber() = -1
exception.getLineNumber() = -1