从文本文件/ XML文件创建C ++类

时间:2012-11-28 17:46:00

标签: c++ class parsing struct text-files

我基本上想为我想要的某些数据类型创建一个内部结构。这些数据类型将保存我的程序中的大部分信息(基本上是一个大型数据库,但我想避免设置一个使用的麻烦)并将序列化/反序列化。

但是我想从文本文件/ ml文件的布局中动态创建这些类/结构。例如:

container Music
field string name
field largenumber filesize
end container

这是一个非常基本的例子:在上面,'container'是数据类型(类或结构),'field'表示一个变量(字符串是...一个stl字符串,一个大数字是一个无符号整数或某些。是的,我意识到我想要像C ++解析器(如编译器)那样检查正确的语法。

我基本上希望我的程序用户创建自己的数据类型(添加字段/删除字段/创建自己的结构)然后永久保存在我的程序中。

(我已经研究了如何在执行此操作时序列化/反序列化 - 我所要做的就是确保我还使用序列化数据保存最后创建的类/结构文本文件,因此我可以重新创建数据类型当我反序列化时。)

有人会知道如何做到这一点,或建议更好地实现我的设计?

P.S。显然,这些信息需要在运行时创建,而不是在编译时创建。

2 个答案:

答案 0 :(得分:1)

对于XML到对象的转换,您实际看到的是SOAP的一部分。我更喜欢RapidXML,但您可以尝试其他XML解析器来创建/读取您的对象。

对于文本文件,您可能必须编写自己的解析器来正确处理文本文件,期望正确的类型和定义,然后相应地生成对象。

我同意,动态创建一个对象并用值填充它并非易事,除非存在一个公共接口。

作为旁注,既然你说你希望你的用户动态地“创建”类型,为什么不用一种简单的脚本语言(或自己制作一个DSL?)

答案 1 :(得分:1)

正如您所建议的那样,我会通过编写XML解析器来做到这一点,数据类型定义将在文件中。这样,解析变得非常简单(使用任何XML读取库)。您可以在运行时创建数据类型,只需要:类容器和类字段,您可以在其中存储名称,类型等。

您预先处理XML文件,生成一个可填充您的某些数据结构的函数,通常如下所示:

Field newfield1 (name, type, whatever);
Field newfield2 (name2, type2, whatever2);
...
Container newContainer;
newContainer.addField(newfield1);
newContainer.addField(newfield2);
...

当然,您可以更好地组织代码,但这只是为了提出这个想法。首先将您的数据类型记录为XML,预处理XML并生成“运行时”.cpp文件以创建动态类型,将其包含在项目中,然后根据需要使用类型。

要创建不同类型的字段(事先不知道),您可以使用boost :: variant(并从XML生成类型列表)。您甚至可以为每个字段生成一个typedef,以确保在以后使用boost时使用正确的类型:get<>。