Как я могу получить дополнительную информацию о недопустимом элементе DOM с помощью Validator?

Я проверяю объект 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) , но интерфейс ErrorHandler дает мне доступ только к SAXParseException , который показывает только номер строки и номер столбца ошибки. Поскольку я использую DOM в памяти, он возвращает -1 для номера строки и столбца.

Есть ли лучший способ сделать это? Я не Я действительно не хочу вручную проверять строки перед добавлением их в DOM, если библиотеки предоставляют мне функцию, которую я ищу.

Я использую JDK 6 update 26 и JDK 6 update 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
5
задан Bringer128 17 November 2011 в 01:48
поделиться