C++ QXmlStreamReader:将readNext()放在循环的开始或结束处?

C++ QXmlStreamReader:将readNext()放在循环的开始或结束处?,c++,qt,C++,Qt,使用Qt的QXmlStreamReader读取Xml数据时: readNext应该放在while的开头或结尾!reader.atEnd循环?我遇到过很多例子,这些例子都是在开头,但也有不少例子是在结尾 QXmlStreamReader reader; while(!reader.atEnd()) { // <- Put reader.readNext() here? QXmlStreamAttributes currentAttributes = reader.attri

使用Qt的QXmlStreamReader读取Xml数据时:

readNext应该放在while的开头或结尾!reader.atEnd循环?我遇到过很多例子,这些例子都是在开头,但也有不少例子是在结尾

QXmlStreamReader reader;
while(!reader.atEnd())
{
    // <- Put reader.readNext() here?

    QXmlStreamAttributes currentAttributes = reader.attributes();
    // Do something with the attributes
    // ...

    // <- Or put reader.readNext() here?
}

我的直觉告诉我应该在循环的开始到呃。。。阅读下一个xml标记,用新数据填充属性等等。但是我不是100%确定,因为有很多例子将readNext放在循环的末尾。把它放在末尾可能还会给我一个off by one的错误,并且在最后一次readNext时变为true,留下最后一个未处理的标记,对吗?

您需要了解类的工作方式以及每个函数的功能。作为一个演示,让我们考虑以下简单的例子:

QXmlStreamReader reader("<info name=\"Foo\"/>");
while (!reader.atEnd()) {
  //reader.readNext();
  auto currentToken = reader.tokenType();
  qDebug() << currentToken;
  reader.readNext();
}
如果我们运行它并在每次迭代中打印出当前标记XML的值,我们将得到以下序列:

StartDocument、StartElement、EndElement、EndDocument readNext调用位于开始处, NoToken,StartDocument,StartElement,ENDELENT READE下一个调用已结束
如您所见,如果readNext处于循环的开始,您可以处理更多的元素,包括文档的开始和结束元素。因此,在这样的循环中,QXmlStreamReader::readNext的早期调用更好。

如果将readNext调用放在末尾,读者应该在循环体的开头指向什么?好问题。我不知道。正如我所说的,我认为它应该在一开始就出现,但由于有相当多的例子把它放在了最后,我有点不确定。