使用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令牌,用新数据填充attribute()等),但是我不确定100%(由于有很多例子)将readNext()放在循环的末尾)。将其放在最后可能还会给我一个错误的错误(最后一个readNext()的atEnd()变为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,EndElement(readNext()调用位于末尾)


如您所见,如果readNext()在循环的开头,则可以处理更多元素,包括文档的begin和end元素。因此,在此类循环中尽早调用QXmlStreamReader::readNext()会更好。

关于c++ - QXmlStreamReader:将readNext()放在循环的开始还是结尾?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48625016/

10-10 11:58