Russian Qt Forum

Qt => XML => Тема начата: BigHom от Октябрь 29, 2012, 07:16



Название: SAX-анализатор XML-документа
Отправлено: BigHom от Октябрь 29, 2012, 07:16
Такая проблема , есть файл в котором несколько документов начинающихся со строчками
<?xml version="1.0" encoding="koi8-r"?>

при вызове SAX-анализатора обрабатывается только 1-й документ из файла , остальные документы как бы игнорируются.
Вопрос: если способ последовательно анализировать документы, находящиеся в одном файле иной , чем в ручную поиск по файлу данных строк : <?xml version="1.0" encoding="koi8-r"?> сравнением , записью в отдельный файл и вызова только тогда SAX-анализатора?


Название: Re: SAX-анализатор XML-документа
Отправлено: Bepec от Октябрь 29, 2012, 07:27
Эмм.. Прочитать в память, разделить на 2 строки, дать обе SAX парсеру?

По идее у него логика работы правильная. Это у вас файл неправильный получается. :)


Название: Re: SAX-анализатор XML-документа
Отправлено: BigHom от Октябрь 29, 2012, 07:58
Изначально в файле несколько документов , вопрос - как "разделить на две строки"? То есть из файла считать в строку и в строке искать начало каждого документа? Выделяя каждый документ в другую, отдельную строку , чтобы потом дать на обработку SAX-анализатору?

Если подробнее , то от сервера получаю информацию и записываю в файл, а потом смотрю что там. И получается , когда там несколько документов принято, то вызывая SAX-анализатор, видится только первый принятый документ , а остальные не видятся так как встречается закрытие документа и как бы анализатор дальше не смотрит...(на сколько я понял)


Название: Re: SAX-анализатор XML-документа
Отправлено: Bepec от Октябрь 29, 2012, 08:24
Это же логично. SAX анализирует промежуток между началом и концом xml. То, что у вас в файле несколько файлов xml сжаты, значит вам надо ручками делить на строки.

Или же дописать своего наследника SAX парсера.(но руками помоему проще).

Простейший код поиска
Код:
QString receiveContent; // принятые данные
if (receiveContent.count("Тут xml заголовок") > 1)
  // тут делим строку.
// далее суём парсеру по очереди, пока строки не кончатся.