Название: Разделение xml Отправлено: LisandreL от Февраль 18, 2014, 14:23 Есть некоторый протокол, который передаёт сообщения в формате xml а-ля:
Код Получаю 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'?>» может быть только вначале. Есть вариант, конечно, резать самому. В простом варианте просто искать <?xml и там где оно встретилось - новое сообщение. В большинстве случаев оно сработает за исключением извращений типа: Код Если пытаться таких штук избегать - считай полноценный парсинг Xml делать надо - чего б совсем не хотелось бы. Соответственно вопрос - есть ли какие-то классы в Qt для парсинга потока Xml документов? Название: Re: Разделение xml Отправлено: popper от Февраль 18, 2014, 15:54 А какой результат вернет QDomDocument::setContent при передаче ему сразу двух xml?
Может быть, эти случаи можно отследить через установленное значение errorLine ? Название: Re: Разделение xml Отправлено: sergek от Февраль 18, 2014, 17:55 Надо посмотреть в сторону SAX (QXmlSimpleReader).
Он, конечно, тоже даст ошибку в таких случаях. Но, скорее всего, можно поиграться с обработчиками. К примеру, вновь запускать разбор документа, начиная со строки, в которой анализатор дает ошибку. Плохо представляю, как анализатору "скармливать" данные по мере поступления. Обычно парсеры работают с уже законченным документом. Да и ошибки анализатора могут быть связаны не только с тем, что в одном файле записаны два документа. |