如何在 Qt 中将 foreach 与 QDomNodeList 一起使用?

Posted

技术标签:

【中文标题】如何在 Qt 中将 foreach 与 QDomNodeList 一起使用?【英文标题】:How do I use foreach with QDomNodeList in Qt? 【发布时间】:2010-05-26 15:57:24 【问题描述】:

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

我刚刚了解了 Qt 中的 foreach 关键字。 (我知道它不在 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&lt;EveCharacter&gt; 中。

大写符号是编译时常量字符串。 (我正在为 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 实际上不是关键字,而是宏。因为 C++ 不支持这种语法,所以 Qt 必须做一些巧妙的预处理器才能使其工作。这意味着任何编译器消息都将针对与您所看到的代码不太相似的代码。 @Skilldrick - 感谢您的解释! 【参考方案1】:

foreach 仅支持container classes,因此不能与QDomNodeList 一起使用。

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

编辑以匹配问题编辑:

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

【讨论】:

@Adam - 我阅读了您链接的文档,但我不明白如何正确使用它们。我在它们中看不到在 DOM 树中导航的方法。您能否提供我使用 QXmlSimpleReaderQXmlStreamReader 的等效代码? 如果你提供// Do something with node就可以了 我会更清楚。如果您只是读取或写入 XML 文件,那么这些文件非常有用。如果您尝试将 XML 用作数据库并且不想使用 XQuery 或 XPath(不知道为什么要这样做),则需要 QDomDocument @Adam - 我添加了// Do something with node 的代码,以及一些关于我需要用它实现什么的更多解释以及一些关于我需要解析哪些 XML 的链接。 @Adam - 只是一个小提示:如果您以@Venemo 开始您的帖子,SO 会通知我我有新的回复。 :)【参考方案2】:

foreach 与Qt Generic Containers 一起使用。 QDomNodeList 看起来不像从任何东西继承,所以你不能使用 foreach

您能否遍历节点列表并将节点插入QList&lt;QDomElement&gt;

【讨论】:

有什么理由链接到容器的 4.2 文档而不是类的 4.6 文档? :) @Adam - 我在发布后不久就更改了它 - 这正是谷歌带来的!我发现你在 Google 上获得的第一个结果是非常随意的...... @Venemo - 很公平。那么,你只需要使用一个丑陋的循环。

以上是关于如何在 Qt 中将 foreach 与 QDomNodeList 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SwiftUI ForEach 内容中将多个按钮操作分开?

有没有办法在 xts 中将 period.apply 与 doParallel 和 foreach 一起使用?

如何在 C++ 语言中将谷歌地图 API 与 MFC 或 QT 一起使用?

在 Qt 中将字符与 unicode 进行比较

在 R 中将 fread 与 foreach 和 doParallel 一起使用

在 .NET 3.5 中将 Parallel.Foreach 与分区器一起使用