Comments.blogs

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

Отправлено 19.03.2007 в 12:28
Отвечает на сообщение 186837
0
Oleg Fedorov wrote:
> А пример такого xml файла и кода для работы с ним
> можно?


Самый простой пример (без сохранения иерархии и relationship) - конфиг:

struct Config
{
enum Domain_e
{
 DOMAIN_ART = 0
, DOMAIN_GAME_DESIGN = 1
, DOMAIN_PROGRAMMING = 2
, DOMAIN_SOUND = 3
};

std::string m_sUser;
std::string m_sPassword;
Domain_e m_eDomain;

bool m_bFileSystemFlat;
boost::filesystem::path m_sMediaPath;

int m_iAutosavePeriod; // minutes
boost::filesystem::path m_sAutosavePath;

struct Layout_c : public serialization::Layout_c < Config >
{
Layout_c()
{
Simple ( "user", &Config::m_sUser, "" );
Simple ( "password", &Config::m_sPassword, "" );
Enum ( "domain", &Config::m_eDomain, DOMAIN_GAME_DESIGN )
.Enumerator( DOMAIN_ART, "art" )
.Enumerator( DOMAIN_GAME_DESIGN, "game_design" )
.Enumerator( DOMAIN_PROGRAMMING, "programming" )
.Enumerator( DOMAIN_SOUND, "sound" )
;
Simple ( "filesystem_flat", &Config::m_bFileSystemFlat, true );
Simple ( "media_path", &Config::m_sMediaPath, "" );
Simple ( "autosave_period", &Config::m_iAutosavePeriod, 10 );
Simple ( "autosave_path", &Config::m_sAutosavePath, "" );
}
};
};

<?xml version="1.0" encoding="windows-1251"?>
<SkyStudio>
<Configuration>
<user>loyso</user>
<domain>programming</domain>
<filesystem_flat>true</filesystem_flat>
<media_path>C:/Dev/Repositories/media</media_path>
<autosave_period>2</autosave_period>
<autosave_path>C:/autosave</autosave_path>
</Configuration>
</SkyStudio>

Сериализация иерархии полиморфных объектов, в данном случае - коллекция
полиморфных объектов:

class Primitive
{
};

class PrimFloat : public Primitive
{
};

struct PrimitiveSerializer : public serialization::SerializeAbstract_T < Primitive >
{
PrimitiveSerializer()
{
RegisterType < PrimFloat > ( "float" );
RegisterType < PrimInt > ( "int" );
RegisterType < PrimBool > ( "bool" );
RegisterType < PrimVec2 > ( "vec2" );
RegisterType < PrimVec3 > ( "vec3" );
RegisterType < PrimVec4 > ( "vec4" );
RegisterType < PrimTexRect > ( "texrect" );
RegisterType < PrimColor > ( "color" );
RegisterType < PrimString > ( "string" );
RegisterType < PrimFileName > ( "filename" );
RegisterType < PrimLink > ( "link" );
RegisterType < PrimEnum > ( "enum" );
}
};

class AttributeStruct
{
...
struct Layout : public serialization::Layout_c < AttributeStruct >
{
Layout()
{
ContainerPtr( "primitives", &AttributeStruct::m_Primitives, serialization::Serializer < PrimitiveSerializer > () );
}
}
...
typedef std::list < Primitive * > Primitives_t;
Primitives_t m_Primitives;
}

в xml:

...
<primitives>
<_ type="float">
<name>yaw</name>
<min>-3.1415</min>
<max>3.1415</max>
</_>
<_ type="bool">
<name>open</name>
<default>true<default>
</_>
</primitives>

В общем, если честно то сейчас я бы не стал все это на C++ писать. И даже на C# бы не стал. Сейчас я бы DSL забабахал для описания и создания диаграмм классов и объектов. И компонентных диаграмм. Не только с целью реализации сериализации разумеется.
Comments.blogs
Администратор группы
Администратор группы
Модераторы группы
Модератор
Списки доступа
  • Подписчики [789]
Права доступа
У обсуждений в этой группе различные ограничения доступа.
Пользователи имеют персональные права доступа к обсуждениям.

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

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

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

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