c++ - 我如何在 Qt 中将 foreach 与 QDomNodeList 一起使用?

标签 c++ qt qt4 foreach qt-maemo

我是 Qt 新手,每天都在学习新东西。
目前,我正在利用空闲时间为我的诺基亚 N900 开发一个小应用程序。
一切正常,我可以在设备上编译和运行 Maemo 应用程序。

我刚刚了解到 foreach Qt 中的关键字。 (我知道它不在 C++ 中,所以我没有考虑它,直到我偶然发现提到它的 Qt 文档。)
因此,我决定将非常烦人且不可读的循环更改为 foreach,但我失败了:

QDomNodeList list = doc.lastChild().childNodes().at(1).firstChild().childNodes();
for (int x = 0; x < list.count(); x++)
{
    QDomElement node = list.at(x).toElement();
    // Do something with node
}

我是这样尝试的:

foreach (QDomElement node, doc.lastChild().childNodes().at(1).firstChild().childNodes())
{
    // Do something with node
}

出于某种原因,上面的代码甚至无法编译。我从编译器收到神秘的错误消息。

有人可以向我解释一下如何正确处理吗?

如果foreach循环不支持 QDomNodeList , 有没有办法处理支持 foreach 的 XML 文件?

编辑:

为了澄清,// Do something with node在这种情况下是以下内容:

EveCharacter chr;
chr.setName(node.attribute(EVE_NAME));
chr.setId(node.attribute(EVE_CHARACTER_ID).toInt());
acc->addCharacter(chr);

acc 的类型是 EveAccount ,它将数据存储在 QList<EveCharacter> 中.

大写符号是编译时常量字符串。
(我正在为 EVE Online API 创建一个客户端。这是来自接收 the account characters XML 并解释它的方法。)

这就是我创建 doc 的方式:

QDomDocument doc;
doc.setContent(reply->readAll());

请注意 replyQNetworkReply*这是从 QNetworkAccessManager 发回的.

然而,由于 EVE API 使用 XML,我在我的应用程序的许多地方做了很多与此非常相似的 XML 解析。
大多数 XML 可能有几百行长,并且可能包含非常不规则的数据模式,such as this one .

最佳答案

foreach只支持 container classes , 所以你不能将它与 QDomNodeList 一起使用.

我不确定你的实际目标,但我找到了 QXmlSimpleReaderQXmlStreamReader是处理 XML 的最简单方法。

编辑以匹配问题编辑:

您正在尝试做的事情看起来像是 XPath 或 XQuery 的主要候选者。看看 QtXmlPatterns模块这将为您提供一组字符节点,而无需遍历所有其他节点。

关于c++ - 我如何在 Qt 中将 foreach 与 QDomNodeList 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2914631/

相关文章:

c++ - Qt - 强制关闭按钮点击(信号/插槽问题)

python - PyQt 和 Bespin(KDE 风格)

使用 vector 的 C++ 类初始化

c++ - 如何禁用 QTableView 的 control+A 快捷方式并防止全选选项?

c++ - 为什么赋值操作完成后调用对象的析构函数

c++ - 为什么 Qt 使用自己的 make 工具 qmake?

qt - Qt Creator:是否有类似VS解决方案的东西,您可以在其中添加项目并设置项目依赖项和构建顺序?

c++ - 有没有办法在 Qt4 中实现 OnReady() 回调?

c++ - 3D 空间中的射线/矩形相交

c++ - 在运算符重载的情况下处理悬挂指针/引用