为什么QXmlQuery似乎在结果中添加了一个\ n? (以及如何解决?)

时间:2018-09-06 07:39:05

标签: c++ qt xpath qxmlquery

编写一些代码以从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

给出结果:

  

“确定\ n”
  3

这显然有一些副作用,我想避免。

为什么添加此\n?以及如何解决?

2 个答案:

答案 0 :(得分:1)

认为,这是由将结果序列化为QXmlFormatter时使用的QString引起的;我怀疑QXmlFormatter::endDocument写了换行符。

一种解决方法是改为输出到字符串列表,然后选择第一个元素:

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

如果需要全部结果,则可以选择join()结果。

答案 1 :(得分:1)

或者,您可以完全控制序列化并使用QXmlSerializerQXmlFormatter。这样,您将在输出中包含任何要求的内容,而不是提供的一些默认值。它将有更多的代码,这是事实,但是其意图将比仅在最后丢弃 some 换行符更清晰。

以下是使用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();
    }
}