我是 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());
请注意 reply
是 QNetworkReply*
这是从 QNetworkAccessManager
发回的.
然而,由于 EVE API 使用 XML,我在我的应用程序的许多地方做了很多与此非常相似的 XML 解析。
大多数 XML 可能有几百行长,并且可能包含非常不规则的数据模式,such as this one .
最佳答案
foreach
只支持 container classes , 所以你不能将它与 QDomNodeList
一起使用.
我不确定你的实际目标,但我找到了 QXmlSimpleReader
和 QXmlStreamReader
是处理 XML 的最简单方法。
编辑以匹配问题编辑:
您正在尝试做的事情看起来像是 XPath 或 XQuery 的主要候选者。看看 QtXmlPatterns
模块这将为您提供一组字符节点,而无需遍历所有其他节点。
关于c++ - 我如何在 Qt 中将 foreach 与 QDomNodeList 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2914631/