Russian Qt Forum
Ноябрь 23, 2024, 14:24 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Изменился фориат (как поступить)  (Прочитано 3078 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Август 04, 2011, 13:49 »

Добрый день

Несколько лет пользователь спокойно жил с XML (формат исходного файла). Но вот что-то у него зачесалось (уж не знаю в каком месте), и он изобрел новый (свой) формат входного файла. В принципе формат вполне разумный (простой текстовик, то же дерево), обсуждать "зачем" смысла нет.

Разборка XNL у меня на wxWidget. Разобрать новый формат - проблем нет, но дело в том что разборка XML у меня тесно переплетена с ф-циональностью - получаю значения тега -  сразу пошли "вытекающие". И что делать? Скопировать старый XML парсер и подставить новые вызовы? Или пытаться обобщить через template? Или др. ходы?

Ваше мнение?

Спасибо
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Август 06, 2011, 21:39 »

наследование - повторное использование кода.
Непонимающий
Записан

Юра.
asvil
Гость
« Ответ #2 : Август 06, 2011, 22:18 »

Таки у вас парсер собственный или готовый dom/sax. Если готовый, то сделать свой парсер для нового древовидного формата с таким же интерфейсом как и xml dom либо sax. Ну и в программе просто заменить строку создания парсера.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Август 07, 2011, 09:33 »

Разборка XML выглядит так (без контроля ошибок)
Код
C++ (Qt)
wxXmlDocument xmlDoc;
xmlDoc.Load(fn);
 
wxXmlNode * root = xmlDoc.GetRoot()
const wxXmlNode * child = LookChild(root, "info");
 
while (child) {
 if (child->GetName() == _T("icon")) {
wxString size = child->GetPropVal(_T("size"), _T("32"));
 ,,,
 child = child->GetNext();
 
С наследованием мрачно поскольку GetName, GetPropVal никакие не виртуал. Template вроде можно но придется заряжать <class T1, class T2, class T3 ..> и, возможно, понять будет сложновато. Также я обязан полностью повторить логику которая мне не всегда нравится (напр хотелось бы пройтись по контейнеру чилдренов вместо while/GetNext).

А главное - если новый формат хоть чуть-чуть изменится (и его дерево уже не будет соответствовать дереву XML) - у меня будут большие проблемы с моей "общей" конструкцией. Поэтому просто скопировал и заменил вызовы парсера. Тоже не блеск (так я имею 2 однотипных куска)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.145 секунд. Запросов: 22.