Как мне использовать foreach с QDomNodeList в Qt?

Я новичок в Qt и каждый день узнаю что-то новое.
В настоящее время я разрабатываю небольшое приложение для своего Nokia 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Есть ли способ обработки файлов XML, который поддерживает foreach?

РЕДАКТИРОВАТЬ:

Чтобы уточнить, // Do something with node в этом случае следующее:

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

Где акк имеет тип EveAccount, который хранит данные в QList<EveCharacter>,

Символы в верхнем регистре являются константами времени компиляции.
(Я создаю клиент для EVE Online API. Это из метода, который получает символы учетной записи XML и интерпретирует его.)

Вот как я создаю doc:

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

Обратите внимание, что reply это QNetworkReply* который отправляется обратно из QNetworkAccessManager,

Тем не менее, так как EVE API работает с XML, я выполняю много синтаксического анализа XML, очень похожего на это, во многих местах моего приложения.
Большинство XML-файлов могут быть длиной в несколько сотен строк и могут содержать довольно нестандартные шаблоны данных, такие как этот.

2 ответа

Решение

foreach поддерживает только классы контейнера, поэтому вы не можете использовать его с QDomNodeList,

Я не уверен в вашей реальной цели, но я нахожу QXmlSimpleReader а также QXmlStreamReader быть самым простым способом иметь дело с XML.

Изменить для соответствия вопроса

То, что вы пытаетесь сделать, выглядит как главный кандидат на XPath или XQuery. Посмотрите на QtXmlPatterns Модуль это даст вам набор узлов персонажей без необходимости проходить через все остальные узлы.

foreach работает с Qt Generic Containers. Это не похоже, что QDomNodeList наследует от чего-либо, поэтому вы не можете использовать foreach,

Не могли бы вы перебрать список узлов и вставить узлы в QList<QDomElement>?

Другие вопросы по тегам