Russian Qt Forum

Qt => XML => Тема начата: LisandreL от Февраль 18, 2014, 14:23



Название: Разделение xml
Отправлено: LisandreL от Февраль 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 документов?


Название: Re: Разделение xml
Отправлено: popper от Февраль 18, 2014, 15:54
А какой результат вернет QDomDocument::setContent при передаче ему сразу двух xml?
Может быть, эти случаи можно отследить через установленное значение errorLine ?


Название: Re: Разделение xml
Отправлено: sergek от Февраль 18, 2014, 17:55
Надо посмотреть в сторону SAX (QXmlSimpleReader).
Он, конечно, тоже даст ошибку в таких случаях. Но, скорее всего, можно поиграться с обработчиками. К примеру, вновь запускать разбор документа, начиная со строки, в которой анализатор дает ошибку.
Плохо представляю, как анализатору "скармливать" данные по мере поступления. Обычно парсеры работают с уже законченным документом.
Да и ошибки анализатора могут быть связаны не только с тем, что в одном файле записаны два документа.