Здравствуйте, гость ( Вход | Регистрация )
lanz | Дата 22.4.2013, 10:01 |
Это я конечно маху дал, думал что QDomNodeList это typedef вроде QObjectList. | |
RazrFalcon | Дата 20.4.2013, 20:23 |
Немного переделал вариант от lanz, так как его не работал. + без доп функции пока никак...
Вроде бы работает верно, и довольно короткая запись. |
|
Алексей1153 | Дата 15.4.2013, 18:57 |
RazrFalcon, node.nextSibling(); находит соседний тег , таким образом ты перебираешь теги одного уровня в текущей "области видимости". Каждый тег помещаешь в стек. Новая итерация извлекает элемент и идёт уже по его чайлдам. Понимаешь фишку ? Поэтому в начале работы алгоритма важно инициализировать стек элементами первого уровня - ещё перед заходом в основной цикл перебора стека кстати, nextSibling() без указания имени ищет любой следующий тег этого же уровня (скорее всего тег будет тот, что идёт в реальном тексте XML , но на это не стоит полагаться, мне кажется - не знаю, что на этот счёт говорит стандарт. Я всегда предполагаю, что порядок выбора может быть случайным) если указать имя предыдущего элемента, найдётся элемент с таким же именем:
хотя, в твоём случае, с неизвестным контентом, это, наверное, не особо пригодится |
|
lanz | Дата 15.4.2013, 16:57 |
? |
|
RazrFalcon | Дата 15.4.2013, 13:58 |
Да, такой способ я видел, но увы QDomDocument не умеет переходить на следующий элемент. По этому такой вариант не работает: Так как node.nextSibling не умеет проверять дочерние элементы. А так как структура xml мне заранее не известна, то не ясно как пройтись по дереву таким способом. |
|
Алексей1153 | Дата 14.4.2013, 15:25 |
переход от рекурсии к итерации производится через создание собственного стека FILO (при рекурсии используется стек вызовов)
Цитата что бы можно было внутри какой-либо функции пройтись по всем элементам. используя схему выше, можно сделать процедуру, собирающую все элементы в один массив в пройденном порядке, затем этот массив передаётся в процедуру обработки каждого элемента. как вариант - работа с предикатом, шаблонная процедура |
|
RazrFalcon | Дата 13.4.2013, 23:34 |
Обычный вариант с рекурсией:
Можно ли, как-то, это обернуть в while, что бы можно было внутри какой-либо функции пройтись по всем элементам. А то сейчас приходиться отдельную функцию заводить... |
|
Просмотр темы полностью (откроется в новом окне) | |
![]() |
Текстовая версия | Сейчас: 18.3.2025, 0:56 |