Написание небольшого кода для извлечения некоторых значений из 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
добавлено? И как это решить?
я считать что это вводится QXmlFormatter
который используется при сериализации результатов в QString
; Я подозреваю что QXmlFormatter::endDocument
пишет новую строку.
Один из обходных путей — вместо этого вывести в список строк, а затем выбрать первый элемент:
QStringList results;
if (query.evaluateTo(&results))
{
const QString& queryResult = results.first();
qDebug() << queryResult;
qDebug() << queryResult.size();
}
Вы можете выбрать join()
результаты вместо, если вам нужны все.
В качестве альтернативы вы можете получить полный контроль над сериализацией и использовать либо 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();
}
}