Digester: пользователь типа элемента должен заканчиваться соответствующим конечным тегом ‹/user›

Я использую Digester для анализа XML-файла и получаю следующую ошибку:

May 3, 2011 6:41:25 PM org.apache.commons.digester.Digester fatalError
SEVERE: Parse Fatal Error at line 2336608 column 3: The element type "user" must be terminated by the matching end-tag "</user>".
org.xml.sax.SAXParseException: The element type "user" must be terminated by the matching end-tag "</user>".

Однако 2336608 — это последняя строка моего текстового файла. Наверное, я открываю тег и никогда его не закрываю. Вы знаете, как я могу найти и исправить это в больших текстовых файлах?

Благодарность


person aneuryzm    schedule 03.05.2011    source источник


Ответы (4)


$ grep -Hin "</\?user>" Text.xml будет печатать каждую строку с помощью или . Если они не вложены, то вы сможете проверить этот вывод и найти отсутствующий закрывающий тег (когда сразу следует . Сценарий делает то же самое:

https://gist.github.com/953837

Это предполагает, что открытый и закрытый теги находятся на разных строках.

person I82Much    schedule 05.05.2011

Напишите еще один скрипт, который сканирует каждый файл строки и всякий раз, когда находит открытый тег <user>, увеличивает счетчик и печатает

line number 1234 <user> opened (1 open total)

и всякий раз, когда он находит закрытый тег </user>, уменьшает счетчик, печатает

line number 4546 </user> closed (0 open total)

Поскольку у вас на один открывающий тег больше, чем закрывающий, окончательный вывод этого скрипта сообщит вам, что 1 тег остался открытым. Однако, предполагая, что ваша модель XML не допускает вложенных тегов <user>, вы можете предположить, что проблемное объявление находится везде, где вы видите вывод line number ... <user> opened (2 open total).

person matt b    schedule 03.05.2011
comment
@matt b Нет ли более быстрого метода, например, использования регулярных выражений из терминала? - person aneuryzm; 03.05.2011
comment
$ grep -Hin "</\?user>" Text.xml выведет каждую строку либо с <user>, либо с </user>. Если они не вложены, то вы сможете проверить этот вывод и найти отсутствующий закрывающий тег (когда <user> следует сразу за <user>). - person I82Much; 03.05.2011
comment
@I82Большое спасибо. Однако строк слишком много.. Я не могу найти ни одной ошибки... знаете ли вы, есть ли способ отобразить строки (или несколько строк) с двумя последовательными ‹user› без ‹/user› посередине? - person aneuryzm; 03.05.2011
comment
Кстати, теперь мне интересно, правильно ли я интерпретирую исключение - person aneuryzm; 03.05.2011
comment
@ I82Much Спасибо, ваш код очень полезен и дает точную строку. НО до сих пор я не могу понять, почему это не работает. У меня есть очень короткий файл XML, который выдает ошибку: pastie.org/1863327 - person aneuryzm; 04.05.2011
comment
@Patrick Патрик, я не вижу ничего плохого в том коротком XML-файле, который вы опубликовали. Можете ли вы показать нам код того, как вы пытаетесь загрузить файл? И какова трассировка стека для этой ошибки? - person I82Much; 04.05.2011
comment
@ I82Much Неважно, я решил, разделив файлы на подфайлы с помощью команды split ... не очень эффективно, но я решил. - person aneuryzm; 04.05.2011
comment
@ Патрик, я не понимаю .. файл был слишком большим? Если да, то как небольшой файл xml показал ту же проблему? - person I82Much; 04.05.2011
comment
@I82I82Многое, я тоже не понимаю. Сценарий, который вы мне передали, обнаруживал ошибку, даже если все было в порядке. Я отказался от кода и просто искал его с помощью двоичного ручного поиска. - person aneuryzm; 04.05.2011
comment
@Patrick Мой сценарий предполагал, что теги open и close находятся в разных строках. В вашем примере это не так, поэтому скрипт ошибочно сообщит о проблемах. - person I82Much; 04.05.2011
comment
@ I82I82 Хорошо, в любом случае, если вы опубликуете свой комментарий о grep, я могу проголосовать за ваш ответ. - person aneuryzm; 05.05.2011

Используйте 1_. http://tidy.sourceforge.net/

Tidy — отличный небольшой инструмент для проверки HTML, а в режиме XML (-xml выше) он также будет проверять XML.

Он выводит номера строк и столбцов для ошибок синтаксического анализа.

Большинство основных менеджеров пакетов (apt, port и т. д.) имеют для этого готовые пакеты.

person Mike Samuel    schedule 03.05.2011
comment
xmllint (xmlsoft.org/xmllint.html) также можно использовать для той же цели. - person BertNase; 03.05.2011
comment
К сожалению, приборка возвращает мне следующую ошибку: строка 2336608, столбец 1 - Ошибка: неожиданное ‹/коллекция› в ‹пользователе›. Точно так же, как и другие инструменты, 2336608 — это последняя строка моего файла, мне нужно знать, где был открыт ‹user›. - person aneuryzm; 04.05.2011
comment
‹/коллекция› — это просто родительский тег в последней строке - person aneuryzm; 04.05.2011

Я думаю, что нет необходимости запускать скрипт для обнаружения ошибок xml. Вы можете использовать валидатор w3 xml, например http://www.w3schools.com/xml/xml_validator.asp

Я только что вставил туда xml размером 15 МБ, и мне удалось довольно легко это исправить. Вы также можете ввести xml в качестве URL-адреса, если у вас есть возможность загрузить его куда-нибудь. Java сообщил об ошибке в каком-то месте, которое казалось нормальным, но этот инструмент локализовал реальную ошибку, и после ее исправления java больше не выдавал ошибку.

Существует много типов ошибок xml, и не все они связаны с вложенной структурой, поэтому лучше просто использовать для этого хорошо известный инструмент. Например, моя ошибка была ошибкой аргумента (мне не хватало "), но java обнаружил проблему вложенности.

person Radu Simionescu    schedule 01.11.2011