QXmlStreamReader:在循环开始或结束时放入readNext()?

时间:2018-02-05 14:41:55

标签: c++ qt

使用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()放在循环结尾的例子。把它放在最后可能也会给我一个一个错误的错误(atEnd()在最后一个readNext()时变为真,留下最后一个令牌未经处理),对吗?

1 个答案:

答案 0 :(得分:1)

您需要了解类的工作原理以及每个函数的作用。作为演示,让我们考虑以下简单示例:

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,EndElement readNext()电话结束)

如您所见,如果readNext()位于循环的开头,您可以处理更多元素,包括文档的开始和结束元素。因此,QXmlStreamReader::readNext()在这种循环中的早期调用更好。