Как проанализировать обычный текстовый файл с случайными тегами XML, используя Java и SAX? - PullRequest
0 голосов
/ 07 февраля 2012

У меня довольно большой файл журнала с сервера, который содержит простой текст.Сервер регистрирует все, что он делает, и иногда он печатает теги XML, которые мне интересны при разборе.В качестве примера:

-----------log file-------------
bla bla bla random text
<logMessage>test Message</logMessage>
some more random server output
<logMessage>some other message</logMessage>
bla bla bla
end of log file

Я просто хочу извлечь данные из тегов и игнорировать остальные.Я использую Java и SAX, но синтаксический анализатор SAX ожидает, что содержимое файла будет строго отформатировано в XML, и он не может обработать этот тип файла.Есть ли способ сказать SAX игнорировать / игнорировать тот факт, что файл не является хорошо отформатированным XML?Какая альтернатива?читать файл построчно и искать теги?(

Ответы [ 2 ]

1 голос
/ 08 февраля 2012

Для простоты я бы выбрал построчное чтение файла и поиск токенов <logMessage> и </logMessage>.Обратите внимание, что вы можете создать общий синтаксический анализатор такого типа, который принимает делегатский анализатор и передает ему SAX-подобные события.(Может быть полезно, в зависимости от того, сколько в противном случае было бы переписать парсеры, теперь ваше решение на основе SAX не работает.)

РЕДАКТИРОВАТЬ: делегатский подход также полезен, если вы заинтересованы в более чемодин вид элемента.Если они имеют сложные (встроенные) XML-иерархии, вы можете даже сопоставить все символы между открывающим и закрывающим токенами в буфер, а затем передать этот буфер в real SAX-анализатор.В большинстве случаев это было бы излишним, но опять же, если у вас есть журналы, которые по существу содержат дампы XML, это может быть более подходящим, чем попытка разобрать все это самостоятельно.

0 голосов
/ 08 февраля 2012

Я не думаю, что прямой синтаксический анализ XML будет уместным для анализа файлов такого типа.Если в строке содержатся все фрагменты XML (открывающие и закрывающие теги находятся на одной строке), то считывание их построчно и проверка наличия тегов будет проще всего сделать пропуском не-XML строк.После того, как вы пропустили не-XML строки, вы можете передать поток для обработки в SAX-парсер или просто использовать регулярное выражение для построчной обработки.

По существу, вышеупомянутый подход идентичен сначала файлу grepping, чтобы оставить только теги XML,затем оберните его в корневой элемент, чтобы получить правильно сформированный XML, и проанализируйте его.

...