为什么 QXmlQuery 似乎要在结果中添加一个 `\n`? (以及如何解决?)
Why QXmlQuery seem to add a ` \n` to results? (and how to solve it?)
编写一些代码从 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?
}
}
预期结果:
"ok"
2
给出的结果:
"ok\n"
3
这显然有一些我想避免的副作用。
为什么要添加这个\n
?以及如何解决?
我 认为 这是由将结果序列化为 QString
时使用的 QXmlFormatter
引入的;我怀疑 QXmlFormatter::endDocument
写了一个换行符。
一个解决方法是改为输出到字符串列表,然后选择第一个元素:
QStringList results;
if (query.evaluateTo(&results))
{
const QString& queryResult = results.first();
qDebug() << queryResult;
qDebug() << queryResult.size();
}
如果您需要全部结果,您可以选择 join()
结果。
或者,您可以完全控制序列化并使用 QXmlSerializer
或 QXmlFormatter
。这样无论你问什么,你都会在输出中得到,而不是你提供的一些默认值。它将有更多的代码,这是真的,但其意图将比仅在末尾丢弃 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();
}
}
编写一些代码从 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?
}
}
预期结果:
"ok"
2
给出的结果:
"ok\n"
3
这显然有一些我想避免的副作用。
为什么要添加这个\n
?以及如何解决?
我 认为 这是由将结果序列化为 QString
时使用的 QXmlFormatter
引入的;我怀疑 QXmlFormatter::endDocument
写了一个换行符。
一个解决方法是改为输出到字符串列表,然后选择第一个元素:
QStringList results;
if (query.evaluateTo(&results))
{
const QString& queryResult = results.first();
qDebug() << queryResult;
qDebug() << queryResult.size();
}
如果您需要全部结果,您可以选择 join()
结果。
或者,您可以完全控制序列化并使用 QXmlSerializer
或 QXmlFormatter
。这样无论你问什么,你都会在输出中得到,而不是你提供的一些默认值。它将有更多的代码,这是真的,但其意图将比仅在末尾丢弃 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();
}
}