c++ - QXmlStreamReader : Put readNext() at the start or at the end of the loop?

标签 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 标记,用新数据填充 attributes() 等)但我不是 100% 确定(由于相当一些将 readNext() 放在循环末尾的示例)。把它放在最后可能还会给我一个差一错误(最后一个 readNext() 的 atEnd() 变为真,最后一个标记未处理),对吗?

最佳答案

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

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() 会更好。

关于c++ - QXmlStreamReader : Put readNext() at the start or at the end of the loop?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48625016/

相关文章:

c++ - 必须在C++文件中写头文件中声明的变量类型吗?

c++ - 根据 C++17 标准草案在 block 作用域中声明为 `extern` 的函数的链接

c++ - Qt eventfilter 不检测 objectName

c++ - 使用 Qt 进行序列化

javascript - 如何使用 JavaScript 动态定义 QML 状态

c++ - 按动态条件/约束过滤图表

c++ - OpenGL 不会绘制三角形,遵循精确的格式

C++ 模板特化语法

qt - Qt4 中的 BitBlt?

python - pyQt "flush"等效项