Как эффективно использовать SAXParseException в Java
Я проверяю XMLSchema на Java и получаю вызовы SAXParseException, когда у меня есть недействительные модели содержимого.
Я собираюсь использовать эти исключения, чтобы выделить, где проверка не удалась, но значения SAXParseExceptions выглядят слишком низкоуровневыми.
Например, для отказа при перечислении я получаю ошибку достоверности, что предоставленное значение не соответствует модели содержимого в одном исключении, и к элементу, к которому она относится в следующем.
Я думаю, что мне нужно иметь утилиту, которая немного абстрагирует, чтобы объединить связанные ошибки и проанализировать текст исключения в пригодных для использования свойствах исключения.
Это разумный подход, или я просто что-то пропустил, или, может быть, библиотеку или вспомогательный класс?
Обновите @timgilbert, спасибо за ответ.
Например, исключение SAXParseException, которое я нашел в t'internet
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() throws org.xml.sax.SAXException в любом случае - не знаю, как я могу уйти от принятия привязки...
Приветствия
Ответы
Ответ 1
Я не совсем понимаю, о чем вы здесь спрашиваете, может быть, вы могли бы предоставить немного больше информации о том, что вы подразумеваете под исключениями, слишком низкими? Неужели сообщения об ошибках не понятны?
У класса SaxParseException есть методы getColumnNumber() и getLineNumber(), которые вы можете представить пользователю, чтобы заставить их исправить ошибки.
Одна вещь, с которой вы можете поэкспериментировать, - это использование различных реализаций XML-синтаксического анализа - каждый парсер будет вызывать ошибку при обнаружении неверного кода, но разные реализации могут иметь разные сообщения об ошибках и цепочки исключений.
Собственно, по этой причине я бы сомневался в том, что вы пытаетесь создать библиотеку, которая проверяет цепочку исключений, и пытается построить из нее более последовательное сообщение об ошибке, поскольку вы будете достаточно тесно связывать свой код с конкретным детали реализации XML-синтаксического анализа (особенно, если вы полагаетесь на конкретную формулировку сообщений об ошибках).
(Извините, это не более конкретный вопрос, может быть, вы могли бы привести пример проблемы, которую вы видите?)
Ответ 2
Brabster Я тоже столкнулся с подобной проблемой, когда мне нужно указать, для какого элемента в xml возникла ошибка. Я решил проблему немного, поддерживая стек в моем обработчике SAX Parser. В методе startElement я нажимаю qName (имя элемента) в стеке и в методе endElement я вывожу qName из стека.
Всякий раз, когда возникает исключение, мой стек представляет полный XPath элемента.
Единственная проблема заключалась в том, что если есть несколько элементов с тем же именем, то вы не знаете, какая ошибка для какого элемента. Но по крайней мере полные детали XPath помогли вместе с LineNumber и ColumnNumber.
Надеюсь, что это поможет.