代码之家  ›  专栏  ›  技术社区  ›  Venemo

如何在qt中使用foreach和qdomnodelist?

  •  11
  • Venemo  · 技术社区  · 15 年前

    我对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
    }
    

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

    有人能给我解释一下怎么把它弄好吗?

    如果 前额 循环不支持 QDomNodeList ,是否有方法处理支持 前额 ?

    编辑:

    澄清, // 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在线API创建客户端。这是从接收 the account characters XML 并加以解释。)

    我就是这样创造的 doc :

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

    注意 reply 是一个 QNetworkReply* 它是从 QNetworkAccessManager .

    但是,由于EVEAPI与XML一起工作,所以在我的应用程序的许多地方,我做了很多与此非常类似的XML解析。
    大多数XML可以有几百行长,并且可以包含非常不规则的数据模式, such as this one .

    2 回复  |  直到 15 年前
        1
  •  8
  •   Adam W    15 年前

    foreach 只支持 container classes ,因此不能与 QDomNodeList .

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

    编辑以匹配问题编辑:

    您要做的看起来像是xpath或xquery的主要候选者。看看 QtXmlPatterns 模块:这将为您提供一组字符节点,而不必遍历所有其他节点。

        2
  •  2
  •   Skilldrick    15 年前

    foreach 作品与 Qt Generic Containers . 看起来不像 QDomNodeList 从任何东西继承,所以不能使用 前额 .

    您可以遍历节点列表并将节点插入到 QList<QDomElement> ?