2010-08-20 3 views
2

Так что у меня есть файл XML, который выглядит следующим образом:Java XML SAX Обработка ошибок

<foo> 
<bar></bar> 
<bar></bar> 
<bar></bar> 
... 
<bar></bar> 
</foo> 

Моя цель состоит в проверке каждого стержневого тега против DTD. Для простоты скажем, что для каждого барового узла, который проходит проверку на DTD, программа выводит «истина», а каждый баровый узел выходит из строя. «0»

Использование анализатора SAX, как бы реализовать это?

Спасибо!

+0

Саксовый парсер уже делает это - что вы пытаетесь сделать – Mark

+0

создать два xml-файла; один из баров узлов, которые прошли, и один из баров узлов, которые потерпели неудачу. – Shawn

+0

@Mark - проверенный саксовый парсер остановится при первой ошибке (AFIAK) –

ответ

4

Использовать проверенный анализатор SAX и не забудьте установить org.xml.sax.ErrorHandler в файле org.xml.sax.XMLReader. ErrorHandler представляет собой интерфейс, вы можете реализовать с 3-мя способами:

  • предупреждение (SAXParseException исключения)
  • ошибки (исключение SAXParseException)
  • FatalError (SAXParseException исключение)

Если реализация ErrorHandler бросков Исключение из синтаксического анализа этих методов остановится. С другой стороны, вы можете поймать хранилище SAXParseException в коллекции и просто вернуться из методов ErrorHandler и продолжить разбор. После завершения синтаксического анализа вы можете проверить свою реализацию ErrorHandler для сохраненных исключений.

SAXParseException содержит полезную информацию, такую ​​как номер столбца/строки, где произошла ошибка.

+0

+1 - отличная идея, я буду помнить об этом! –

+0

Я использовал вариацию этого, спасибо – Shawn

0

Трудно, потому что (стандартный) синтаксический анализатор XML остановится при первой ошибке проверки. Редактор XML eclipse отличается, он показывает все ошибки проверки, но его нелегко извлечь из него и использовать его вне рамки eclipse ...

Попробуйте это: проанализируйте весь документ с помощью неаудирующего SAX Parser и подавать каждый элемент панели ко второму проверяющему синтаксическому анализатору. Вам понадобится производный dtd для второго парсера, потому что он увидит корневой элемент с именем bar. Это должно дать результаты проверки элементов бара.

Смежные вопросы