Как мне использовать foreach с QDomNodeList в Qt? - PullRequest
11 голосов
/ 26 мая 2010

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

EDIT:

Для пояснения, // 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-файлов могут быть длиной в несколько сотен строк и могут содержать совершенно нерегулярные шаблоны данных, такие как , такие как этот .

Ответы [ 2 ]

8 голосов
/ 26 мая 2010

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

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

Изменить в соответствии с вопросом редактировать:

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

2 голосов
/ 26 мая 2010

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

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

...