Comments.blogs

А как вы работаете с xml?

19 мар 2007 10:18
0
(Текст записи скрыт. Показать...)
Интересно, как сейчас в разных компаниях обстоит дело с работой с xml форматом? Используете или нет? Если да, то какие средства для чтения\записи? Какие именно фичи из xml используется?
Есть мнение, что мы изобретали в очередной раз свой велосипед – хотелось бы это обсудить и понять, так ли это .
Вкратце про эволюцию работы с xml у нас в Лесте читай в блоге...


Началась наша работа с xml с парсера TinyXml. Достаточно удобный и простой парсер. Его просто подключить, просто использовать. Его минусы проявляются только когда появляются огромные xml файлы или когда надо работать с частями этих файлов, хранить subNodes и т.п. – тут начинаются тормоза и проблемы с памятью. Также проблемой являлось то, что не было типизации – в любую ноду можно было записать все, что угодно и только в момент загрузки можно было сконвертировать в нужный тип из строки.
Вот кусок такого файла:

<IconName value="DE_PC1000"/>
<Icon value="TL/Icon/Ammo/DE_PC1000"/>
<ExploPower value="150"/>
<IsBomb value="true"/>

Дальнейшим шагом было написание товарищем Corvax (http://www.dtf.ru/person/info.php?id=1212) системы классов, имеющих у нас кодовое имя SMCC. Это фактически был набор классов, которые хранили в себе данные из xml и умели загружаться и сохраняться в него. Всё на умных указателях. Работать стало удобнее за счет того, что нам нужно было строго ограниченное число типов данных внутри xml (object, string, int, float, bool, wstring, data). Вот кусок такого файла:

<object name = "Second_Turret_155_Yamato">
<integer name = "Country" value = "2"/>
<string name = "Type" value = "Gun"/>
<boolean name = "Production" value = "false"/>
<float name = "Weight" value = "177"/>
</object>

Вот работа с ним:


for (CompoundObject::ConstIterator i = turrets->begin(),
iend = turrets->end();
i != iend;
++i
)
{
std::string name = i->first; // "Second_Turret_155_Yamato"
ObjectAttribute turret = i->second;

IntegerAttibute attrCountryId = turret->get("Country");
int attrCountryId = attrCountryId->getValue();

std::string turretType = turret->getAs<TypeId::String>("Gun")->getValue();

bool production = safeGetValue(turret, "Production", false);

Attribute attrWeight = turret->get("Weight");
double weight = As<TypeId::Float>(attrWeight)->getValue();
}


Этот файл уже имеет типизацию, которую можно проверять и выдавать Exception, если тип неправильный.
Минусом первого варианта системы SMCC было то, что она была надстройкой над TinyXml и вся загрузка и сохранение велась через нее.
Дальнейшей оптимизацией было создание своего парсера xml для нашего формата. Он легковесный и работает в несколько раз быстрее TinyXml.
Следующей мыслью было то, что у нас строго ограниченный набор типов в xml, а значит можно сделать и бинарный формат. Сделали. Получили прирост скорости парсинга xml еще в несколько раз. Например, файл сэйва занимал 50mb в xml, старый парсинг и сохранение могли занимать 10 и более секунд, а новый отрабатывает менее, чем за секунду.
Ну и недавно дошли руки до загрузки xml с помощью Loading inplace. Это вообще максимально быстрый алгоритм. Работает за счет того, что число типов ограничено.
Естественно, все форматы грузятся любым загрузчиком. Даже Loading inplace грузит обычный xml, правда медленно, т.к. сначала надо распарсить всю структуру.
Также пришлось написать утилиту, конвертирующую форматы xml в разные виды, чтобы можно было бинарные форматы конвертировать в текстовый для просмотра и редактирования, но т.к. большинство xml экспортятся из maya или базы данных, то делать это приходится нечасто.

В итоге сейчас мы имеем систему работы с xml, сочетающую в себе как плюсы бинарных файлов, так и удобство текстового xml формата.
А у вас есть такой велосипед?
Отправлено 20.03.2007 в 22:32
Отвечает на сообщение 186834
0
дубль
« Пред по времени | дереву Следующее непрочтенное След по времени | дереву »
.. Oleg Fedorov 19.03.2007 10:40
... Alexey Baskakov 19.03.2007 10:40
.... Oleg Fedorov 19.03.2007 10:49
..... Alexey Baskakov 19.03.2007 12:28
...... Oleg Fedorov 20.03.2007 12:34
....... Alexey Baskakov 20.03.2007 13:19
........ Oleg Fedorov 20.03.2007 15:35
......... Alexey Baskakov 20.03.2007 15:53
.......... Oleg Fedorov 20.03.2007 16:12
........... Alexey Baskakov 20.03.2007 16:21
............ Oleg Fedorov 20.03.2007 16:36
.... Денис Шамонин 19.03.2007 13:12
... Сергей Захаров 20.03.2007 14:46
.... Oleg Fedorov 20.03.2007 15:32
..... Сергей Захаров 21.03.2007 11:16
...... Oleg Fedorov 21.03.2007 11:58
... Сергей Юрков 20.03.2007 22:32
... Сергей Юрков 20.03.2007 22:32
Comments.blogs
Списки доступа
  • Подписчики [789]
Права доступа
У обсуждений в этой группе различные ограничения доступа.
Пользователи имеют персональные права доступа к обсуждениям.

Copyright © 2021 ООО "ДТФ.РУ". Все права защищены.

Воспроизведение материалов или их частей в любом виде и форме без письменного согласия запрещено.

Замечания и предложения отправляйте через форму обратной связи.

Пользовательское соглашение