Почему QXmlQuery, кажется, добавляет `\ n` к результатам? (и как это решить?) - PullRequest
0 голосов
/ 06 сентября 2018

При написании небольшого кода для извлечения некоторых значений из 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 ]

0 голосов
/ 06 сентября 2018

В качестве альтернативы вы можете получить полный контроль над сериализацией и использовать либо 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();
    }
}
0 голосов
/ 06 сентября 2018

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

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

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

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

...