crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> QXmlStreamReader и большое количество уровней
SABROG
  опции профиля:
сообщение 13.7.2009, 14:50
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Решил попробовать класс QXmlStreamReader. Изучив пример streambookmarks я реализовал свой парсер. И вот что мне не понравилось. Можно написать простенький код, который будет сравнивать каждое название ключа на токен isStartElement с нужным нам. Недостаток такого метода - большое количество операций сравнений и падение скорости. Зато очень просто, когда ключи имеют уникальные имена, не нужно контролировать вложенность, родительские отношения. Второй вариант (правильный). На каждый уровень дерева выделяется отдельный метод с while(!atEnd()). Подобное выделение требует создание нового метода для каждого такого уровня. Если глубина дерева в xml'e большая, то можно себе представить какое огромное количество методов получится! Например у меня глубина дерева такая:

tourml/sources/source/packets/packet/packetheader/spo/dates/date


Т.е. 9 методов (на каждый уровень) и в каждом по циклу while(). При этом меня совершенно не интересуют промежуточные уровни, только последние.

Теперь сижу и думаю может сделать какие-нибудь указатели на методы, которые будут вызываться по очереди на одном while. Скажем QQueue/QHash с указателем на метод и строкой сравнения.
---
Только вот на самом деле там даже больше 9и методов получится, т.к. в xml'е еще другие блоки есть, такой например:

tourml/references/tourtypes/tourtype


Сообщение отредактировал SABROG - 13.7.2009, 14:59
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
ViGOur
  опции профиля:
сообщение 15.7.2009, 10:32
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Ты немного не понял, рекурсия c примерно таким условием:

struct sCallName
{
   QString m_szName;   // Имя XML узла
   void (*m_pFunc)(void*); // Call back функция которую нужно вызвать для этого имени.
};

// ...

QVector<sCallName*> m_vecNames;

// Где-то  m_vecNames заполняется
// ...

while( !isEndElement() && name() == m_vecNames[i].m_szName)
{
   readNext();
   m_vecNames[i].(*m_pFunc)( pVoid); // pVoid - это данные которые тебе нужны для обработки или еще чего там...
}
общая идею думаю должна быть понятна. :)
если не понятно, постараюсь описать подробней.

Сообщение отредактировал ViGOur - 15.7.2009, 10:37
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- SABROG   QXmlStreamReader и большое количество уровней   13.7.2009, 14:50
- - ViGOur   Код в студию, можно занятся оптимизаторством и уни...   13.7.2009, 15:56
|- - SABROG   Цитата(ViGOur @ 13.7.2009, 16:56) Код в с...   13.7.2009, 17:45
- - ViGOur   Жесть! А почему нельзя сделать рекурсию с соз...   13.7.2009, 19:29
- - SABROG   Цитата(ViGOur @ 13.7.2009, 20:29) А почем...   13.7.2009, 20:28
- - SABROG   Да уж, что-то не очень получается. Если делать рек...   14.7.2009, 14:25
- - SABROG   В общем посмотрел я десяток примеров использования...   14.7.2009, 22:40
- - ViGOur   Ты немного не понял, рекурсия c примерно таким усл...   15.7.2009, 10:32
- - SABROG   Да оно всё это понятно, я тоже об этом говорю. Сам...   15.7.2009, 11:14
- - ViGOur   Так в том то и дело, что в твоем случае как я поня...   15.7.2009, 12:24
- - Tonal   То, что тут пытаетесь изобразить, называется конеч...   15.7.2009, 12:38
- - SABROG   Как я и писал выше затык будет в заполнении таблиц...   15.7.2009, 13:16
- - SABROG   Такой вопрос насчет QXmlStreamReader::PrematureEnd...   15.7.2009, 21:35
- - SABROG   Нашел забавную статью про StAX, пример рассматрива...   22.7.2009, 15:33
- - SABROG   Сегодня заметил статью в блоге на QtSoftware и о т...   24.7.2009, 13:27
- - Litkevich Yuriy   Цитата(SABROG @ 24.7.2009, 17:27) я немно...   24.7.2009, 13:39
- - SABROG   В общем я немного заморочился на эту тему и напи...   29.8.2009, 14:40


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


6 чел. читают эту тему (гостей: 6, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 21.12.2024, 17:29