编写一些代码从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
给定结果:
"ok\n“ 3.
这显然有一些副作用,我想避免。
\n 补充道:,为什么这是,?以及如何解决它?
发布于 2018-09-06 08:01:24
我认为这是由QXmlFormatter引入的,它是在将结果序列化到QString时使用的;我怀疑QXmlFormatter::endDocument会写换行符。
解决方法之一是将其输出到字符串列表,然后选择第一个元素:
QStringList results;
if (query.evaluateTo(&results))
{
const QString& queryResult = results.first();
qDebug() << queryResult;
qDebug() << queryResult.size();
}如果您需要所有结果,您可以选择join()结果。
发布于 2018-09-06 08:33:38
或者,您可以完全控制序列化,并使用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();
}
}https://stackoverflow.com/questions/52198868
复制相似问题