Как мне использовать 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>
?