Russian Qt Forum

Программирование => Общий => Тема начата: Igors от Август 04, 2011, 13:49



Название: Изменился фориат (как поступить)
Отправлено: Igors от Август 04, 2011, 13:49
Добрый день

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

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

Ваше мнение?

Спасибо


Название: Re: Изменился фориат (как поступить)
Отправлено: lit-uriy от Август 06, 2011, 21:39
наследование - повторное использование кода.
???


Название: Re: Изменился фориат (как поступить)
Отправлено: asvil от Август 06, 2011, 22:18
Таки у вас парсер собственный или готовый dom/sax. Если готовый, то сделать свой парсер для нового древовидного формата с таким же интерфейсом как и xml dom либо sax. Ну и в программе просто заменить строку создания парсера.


Название: Re: Изменился фориат (как поступить)
Отправлено: Igors от Август 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 однотипных куска)