Вопрос

Я новичок в 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>?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top