Как эффективно использовать SAXParseException в Java - PullRequest
13 голосов
/ 07 апреля 2009

Я проверяю XMLSchema в Java и получаю исключения SAXParseException, когда у меня недопустимые модели содержимого.

Я собираюсь использовать эти исключения, чтобы выделить, где проверка не удалась - но SAXParseExceptions, кажется, слишком низкоуровневый.

Например, при сбое в перечислении я получаю ошибку достоверности, что указанное значение не соответствует модели содержимого в одном исключении, а элемент, к которому он применяется, - в следующем.

Мне кажется, мне нужна утилита, которая немного абстрагируется, чтобы объединить связанные ошибки и разобрать текст исключения в пригодные для использования свойства исключения.

Это разумный подход, или я просто что-то упускаю, или, возможно, библиотека или вспомогательный класс?


Обновление @timgilbert, спасибо за ответ.

Например, исключение SAXParseException, которое я нашел в Интернете

cvc-pattern-valid: Value 'en' is not facet-valid
with respect to pattern '([a-zA-Z]{1,8})(-[a-zA-Z0-9]{1,8})*'

Ключевыми вещами для меня являются

  • Элемент 'en', к которому относится это исключение. Почему я не могу вызвать exception.getElement () или что-то, и почему не XPath к рассматриваемому элементу? Более полезно с документом в памяти, чем номер строки и столбца!
  • Это ошибка проверки шаблона. Почему я не могу получить что-то вроде перечисления возможных типов сбоев и ссылки на соответствующий?
  • Фактический шаблон, по которому проверка не удалась.
  • Далее будет добавлено еще одно исключение, сообщающее мне значение элемента 'en', вызвавшего проблему, с которой мне нужно объединиться

Пример того, что я хотел бы сделать, это сделать так, чтобы люди отправляли документ и выдвигали на первый план документ, где проверка не проходит, с удобным сообщением - сообщение об ошибке выше вроде не очень дружелюбно ... необходимость разбираться в одинарных кавычках - это просто несчастный случай, ожидающий, чтобы это произошло :)

Я думаю, что, возможно, я делаю это неправильно с «ссылкой на элемент», и, возможно, мне нужно иметь преобразование идентичности документа по умолчанию как часть проверки и дополнить преобразование ошибкой проверки атрибуты, которые я могу выбрать с помощью CSS. Это все равно не поможет, если мне нужно будет проанализировать сообщения, чтобы сделать их более дружелюбными ...

Re: жесткая привязка, javax.xml.validation.Validator.validate () все равно генерирует исключение org.xml.sax.SAXException - не уверен, как я могу избежать предположения о привязке ...

Приветствия

Ответы [ 2 ]

1 голос
/ 09 декабря 2009

Brabster Я тоже сталкивался с подобной проблемой еще тогда, когда мне нужно было сказать, для какого элемента в xml возникла ошибка. Я немного решил проблему, поддерживая стек в моем обработчике SAX Parser. В методе startElement я помещаю qName (имя элемента) в стек, а в методе endElement извлекаю qName из стека.

Всякий раз, когда возникает исключение, мой стек представляет полный XPath элемента.

Единственная проблема состояла в том, что если существует несколько элементов с одинаковым именем, вы не знаете, какая ошибка для какого элемента. Но по крайней мере полные сведения о XPath помогли вместе с LineNumber и ColumnNumber.

Надеюсь, это поможет.

1 голос
/ 08 апреля 2009

Мне не совсем понятно, о чем вы спрашиваете здесь, может быть, вы могли бы немного подробнее рассказать о том, что вы подразумеваете под слишком низкими уровнями исключений? Неужели сами сообщения об ошибках не понятны?

Класс SaxParseException имеет методы getColumnNumber () и getLineNumber (), которые вы можете представить пользователю, чтобы они могли исправить ошибки.

Одна вещь, с которой вы можете поэкспериментировать, - это использовать разные реализации синтаксического анализа XML - каждый синтаксический анализатор выдаст ошибку, когда обнаружит недействительный код, но разные реализации могут иметь разные сообщения об ошибках и цепочки исключений.

На самом деле, по этой причине я бы сомневался в том, чтобы попытаться создать библиотеку, которая проверяет цепочку исключений и пытается создать из нее более связное сообщение об ошибке, так как вы будете довольно тесно связывать свой код с конкретным подробности реализации XML-анализа (особенно, если вы полагаетесь на конкретное словосочетание сообщений об ошибках).

(Извините, это не более конкретно, может быть, вы могли бы привести пример проблемы, с которой вы сталкиваетесь?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...