Почему QXmlQuery, кажется, добавляет `\ n` к результатам? (и как это решить?)

Написание небольшого кода для извлечения некоторых значений из XML, результат XPath, кажется, добавляет \n после содержания.

#include <QCoreApplication>
#include <QXmlQuery>
#include <QString>
#include <QDebug>

auto main(int argn, char* argc[])->int
{
QCoreApplication app(argn, argc);

QString replyContent="<Root isOk='ok'/>";

QXmlQuery query;
query.setFocus(replyContent);
query.setQuery("string(//@isOk)");

// Attribute seem to add \n
QString queryResult;
if (query.evaluateTo(&queryResult))
{
qDebug() << queryResult;              // Where this \n come from?
qDebug() << queryResult.size();       // Why 3? shouldn't be 2?
}
}

Ожидаемый результат:

«Хорошо»
2

Данный результат:

«ОК \ п»
3

Это, очевидно, имеет некоторые побочные эффекты, которых я хотел бы избежать.

Почему это \n добавлено? И как это решить?

2

Решение

я считать что это вводится QXmlFormatter который используется при сериализации результатов в QString; Я подозреваю что QXmlFormatter::endDocument пишет новую строку.

Один из обходных путей — вместо этого вывести в список строк, а затем выбрать первый элемент:

QStringList results;
if (query.evaluateTo(&results))
{
const QString& queryResult = results.first();
qDebug() << queryResult;
qDebug() << queryResult.size();
}

Вы можете выбрать join() результаты вместо, если вам нужны все.

1

Другие решения

В качестве альтернативы вы можете получить полный контроль над сериализацией и использовать либо QXmlSerializer или же QXmlFormatter, Таким образом, вы будете иметь в выводе все, что просите, а не некоторые значения по умолчанию, которые вам предоставляются. В нем будет больше кода, это правда, но цель будет яснее, чем просто отбрасывать немного перевод строки в конце.

Вот пример того, как это сделать с QXmlSerializer (который не производит лишних символов по умолчанию):

#include <QCoreApplication>
#include <QXmlQuery>
#include <QXmlSerializer>
#include <QString>
#include <QBuffer>
#include <QDebug>

auto main(int argn, char* argc[])->int
{
QCoreApplication app(argn, argc);

QString replyContent="<Root isOk='ok'/>";

QXmlQuery query;
query.setFocus(replyContent);
query.setQuery("string(//@isOk)");

QBuffer buffer;
buffer.open(QBuffer::ReadWrite);
QXmlSerializer serializer(query, &buffer);
if (query.evaluateTo(&serializer))
{
QString queryResult = QString::fromUtf8(buffer.buffer());
qDebug() << queryResult;
qDebug() << queryResult.size();
}
}
1

По вопросам рекламы [email protected]