Название: [Решено] Потоковый разбор документа Отправлено: vunder от Сентябрь 23, 2010, 11:43 По TCP получаю порциями xml-документы. Если размер небольшой, то приходит одной порцией, а если данных много, то несколько посылок.
Сначала использовать DOM-парсер, но при увеличении размера блока данных уже не мог им парсить. Почитал, что SAX-парсер (QXmlSimpleReader) позволяет работать с xml, постеменно обрабатывая данные через метод parse(xmlInput, true) и parseContinue(). Но возникла некоторая сложность: как с помошью SAX-парсера прочитать несколько документов в одном файле. Например, данные такие: Код При отправке такого блока QXmlSimpleReader получаю данные только первого блока. Как быть? Или все же придется переходить на QXmlStreamReader? Название: Re: Потоковый разбор документа Отправлено: deaks от Сентябрь 23, 2010, 17:54 в xml-документе заголовок 1го уровня - то есть <?xml ?> может быть только один, следовательно и все QT-шные способы разбора (DOM, SAX) будут воспринимать только 1ый документ.
собственно выход у вас действительно один - QXmlStreamReader Название: Re: Потоковый разбор документа Отправлено: vunder от Сентябрь 24, 2010, 08:27 Попробовал QXMLStreamReader. Тоже не получилось. При чтении второго документа в блоке данных, генерит ошибку XML declaration not at start of document. Причем после этой ошибки при вызове мотода addData() метод atEnd() всегда возвращает true.
Название: Re: Потоковый разбор документа Отправлено: deaks от Сентябрь 24, 2010, 09:26 хм...надо что-то придумать
все-таки в xml документе может быть только один родитель DOCUMENT наверно если нельзя изменить входную структуру, то придется писать свой парсер под такие xml-ки Название: Re: Потоковый разбор документа Отправлено: Alp от Сентябрь 24, 2010, 11:00 Qt ориентирована на работу с well-formed xml-документами. А у тебя - он совсем не well-formed. Так что, думаю, стандартными средствами прочитать второй корневой элемент никак.
Название: Re: Потоковый разбор документа Отправлено: vunder от Сентябрь 24, 2010, 16:35 Нашел решение.
При разборе запоминаю первый тэг в документе. Когда получаем QXmlStreamReader::EndElement этого тэга проверяем, совпадает ли текущая позиция анализатора с размером обрабатываемого блока. Если нет, значит в блоке находятся несколько домументов, поэтому сбрасываем состояние парсера, а остаток строки добавляем на обработку Код
Название: Re: [Решено] Потоковый разбор документа Отправлено: EDJ от Сентябрь 27, 2010, 21:28 В одном проекте тоже получал пачки xml-команд через tcp. Между командами мы с коллегами ставили разделитель, которого никогда не могло быть в самих данных - '\0' ;)
Название: Re: [Решено] Потоковый разбор документа Отправлено: vunder от Сентябрь 28, 2010, 08:55 В одном проекте тоже получал пачки xml-команд через tcp. Между командами мы с коллегами ставили разделитель, которого никогда не могло быть в самих данных - '\0' ;) Тоже как вариант. |