Я проверяю объект DOM в памяти, используя класс javax.xml.validation.Validator
по схеме XSD. Я получаю SAXParseException
во время проверки всякий раз, когда есть какое-то повреждение данных в информации, из которой я заполняю свой DOM.
Пример ошибки:
org.xml.SAXParseException: cvc-datatype-valid.1.2.1: '???"??[?????G?>???p~tn??~0?1]' не является допустимым значение для '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 6, обновление 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