Как я могу использовать Foreach с QDomnodelist в Qt?
Вопрос
Я новичок в Qt, и я знаю что-то новое каждый день.
В настоящее время я разрабатываю небольшое приложение для моей Nokia N900 в свободное время.
Все в порядке, я могу компилировать и запустить приложения Maemo на устройстве.
Я только что узнал о foreach
ключевое слово в Qt. (Я знаю, что это не в C ++, поэтому я не думал об этом, пока я случайно не наткнулся на Qt Doc, который упомянул его.)
Итак, я решил изменить свои довольно раздражающие и нечитаемые петли к 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);
Где ACC имеет тип EveAccount
, который хранит данные в QList<EveCharacter>
.
Прописные буквы - постоянные строки времени компиляции.
(Я создаю клиента для EVE Online API. Это из метода, который получает Символы учетной записи XML и интерпретирует это.)
Вот как я создаю doc
:
QDomDocument doc;
doc.setContent(reply->readAll());
Обратите внимание, что reply
это QNetworkReply*
который отправляется обратно из QNetworkAccessManager
.
Однако, как EVE API работает с XML, я делаю много XML разборки очень похоже на это во многих местах в моем приложении.
Большинство XML могут быть длинными длиной несколько сотен и могут содержать довольно нерегулярные шаблоны данных, такие как этот.
Решение
foreach
только поддерживает Классы контейнеров, Так что вы не можете использовать его с QDomNodeList
.
Я не уверен в вашей реальной цели, но я нахожу QXmlSimpleReader
а также QXmlStreamReader
быть самым простым способом справиться с XML.
Редактировать, чтобы соответствовать вопросу Редактировать:
То, что вы пытаетесь сделать, выглядит как главный кандидат на XPath или XQuery. Посмотрите на QtXmlPatterns
Модуль Это даст вам набор узлов символов без предварительного цикла через все другие узлы.
Другие советы
foreach
работает с QT общие контейнеры. Отказ Это не похоже на QDomnodelist наследует от чего-либо, так что вы не можете использовать foreach
.
Можете ли вы повторить через список узлов и вставить узлы в QList<QDomElement>
?