Russian Qt Forum
Май 03, 2024, 07:09 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Разделение xml  (Прочитано 4422 раз)
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« : Февраль 18, 2014, 14:23 »

Есть некоторый протокол, который передаёт сообщения в формате xml а-ля:
Код
XML
<?xml version='1.0' encoding='utf-8'?>
<ping />
Получаю QDomDocument используя bool QDomDocument::setContent(const QString & text, bool namespaceProcessing, QString * errorMsg = 0, int * errorLine = 0, int * errorColumn = 0).
Всё бы ничего, но транспортный протокол TCP соответственно сообщения может нарезать на кусочки лил склеивать.

С нарезанием ещё как-то справиться можно - если произошла ошибка, значит возможно ещё не целиком пришло сообщение и надо ещё подождать.

А если наоборот произошло склеивание а-ля:
Код
XML
<?xml version='1.0' encoding='utf-8'?>
<message id="1" />
<?xml version='1.0' encoding='utf-8'?>
<message id="2" />
Такой xml не распарсится, так как «<?xml version='1.0' encoding='utf-8'?>» может быть только вначале.
Есть вариант, конечно, резать самому.
В простом варианте просто искать <?xml и там где оно встретилось - новое сообщение.
В большинстве случаев оно сработает за исключением извращений типа:
Код
XML
<?xml version='1.0' encoding='utf-8'?>
<text>
 Processing instruction: <![CDATA[<?xml version='1.0' encoding='utf-8'?>]]>
</text>
Если пытаться таких штук избегать - считай полноценный парсинг Xml делать надо - чего б совсем не хотелось бы.

Соответственно вопрос - есть ли какие-то классы в Qt для парсинга потока Xml документов?
Записан
popper
Гость
« Ответ #1 : Февраль 18, 2014, 15:54 »

А какой результат вернет QDomDocument::setContent при передаче ему сразу двух xml?
Может быть, эти случаи можно отследить через установленное значение errorLine ?
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 870


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #2 : Февраль 18, 2014, 17:55 »

Надо посмотреть в сторону SAX (QXmlSimpleReader).
Он, конечно, тоже даст ошибку в таких случаях. Но, скорее всего, можно поиграться с обработчиками. К примеру, вновь запускать разбор документа, начиная со строки, в которой анализатор дает ошибку.
Плохо представляю, как анализатору "скармливать" данные по мере поступления. Обычно парсеры работают с уже законченным документом.
Да и ошибки анализатора могут быть связаны не только с тем, что в одном файле записаны два документа.
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.055 секунд. Запросов: 22.