使用 STL 构建简单的 DOM 模型及其脚本方案





2.00/5 (6投票s)
2004 年 10 月 17 日
3分钟阅读

27598

154
使用STL构建一个简单的DOM模型及其脚本方案。
目录
[ ^ ]引言
STL提供了一组非常丰富的容器,用于动态存储对象。由此构建的代码与平台无关。 两年前学习STL时,我开始编写一些代码,结果变成了一个脚本方案,用于存储类似于.ini文件的设置。 这里的代码可能并不完美,但我已使其无错误地工作。 是的,它可以在VC 6、7.0上运行,并且可能在VC 7.1、Intel、Borland 5.5和Borland Builder、GCC的Mingw端口、GCC、Digital Mars以及其他众多平台上运行…
它演示了构建一个唯一的DOM模型来解析文本文件。 它是一个具有三个存储级别的树。 生成的文本文件如下所示
[ ^ ]
文本文件
这是一个典型的脚本方案,DOM树通过该方案保存到文件中。
这是颜色C++对话框使用的数据库文件。 请勿编辑此文件。 这是高度可配置的,取代了Windows的ini和注册表系统。 有关更多信息,请参阅关于。
«color»-------------------------------------------------------------------
<c-val:0> 264754
<c-val:1> 792892
<c-val:2> 1321030
<c-val:3> 1849168
<c-val:4> 2377306
<c-val:5> 2905444
<c-val:6> 3433582
<c-val:7> 3961720
<c-val:8> 4489858
<c-val:9> 5017996
<c-val:10> 5546134
<c-val:11> 6074272
<c-val:12> 6602410
<c-val:13> 7130548
<c-val:14> 7658686
<c-val:15> 8186824
<RGB-init> 0
«Button»-------------------------------------------------------------------
<Button-state> 107
«Always-on-top»-------------------------------------------------------------
<if top> 0
«Window-Placement»----------------------------------------------------------
<TopMax-x> -1
<TopMax-y> -1
<TopMin-x> -1
<TopMin-y> -1
<Rect-left> 490
<Rect-top> 196
<Rect-right> 690
<Rect-bottom> 378
[ ^ ]
特点
它可以在树的内部存储无限长度的字符串作为注释。 它具有重载函数,用于存储和检索不同数据类型的值,即,可以使用一个函数调用来检索整数、浮点值或字符串列表。 它内置了良好的错误更正功能。
由于它使用STL的文件流,并且用于它的所有函数都来自标准C++库,因此它是平台无关的。 即,它将在Win32、Linux、Mac、HP-UNIX等上运行。
由于它是开源的,没有任何附加条件,您可以修改、删除、移除、添加、替换、转储它、拒绝它,甚至可以声称它是您的。
[ ^ ]
它的工作原理(对于用户)
首先创建一个parser类的对象
parser p;
向其添加变量
- 首先添加一个section
p.add("window_position");
- 向其添加变量
p.add("window_position","top",50);
如果使用以下行,它将返回一个错误,因为section不存在。
p.add("long_section","long_val",1232323);
正确的方法是
p.add("long_section"); p.add("long_section","long_val",1232323);
要从中获取变量,您可以首先检查section。
if(p.get("section")) p.get("section","long_val",lVar);
删除一个section
p.del("section");
删除一个变量
p.del("section","variable_name");
删除所有
p.del_all();
更改一个值
p.set("section","variable_name", new_value);
添加注释字符串
p.add_comment("infinite long string");
或
p.add_comment("string",iPos);
获取注释字符串
char szBuffer[iEnoughSpace];
p.get_comment(szBuffer,iPos);
删除注释字符串
p.del_comment(iPos);
从文件中解析
p.get_file_en_parse("file_path");
如果在解析时出现错误,您将收到一个错误。
将dom树保存到文件
p.get_all_en_save("file_path");
实际上,您甚至可以通过将其强制转换为 (char*
) 并附加一个0来添加对象。
[ ^ ]
内部工作原理
它使用三种类型的对象。 第一个对象存储值名称和值(类vh
),第二个对象存储第一个对象和注释字符串(类section
),第三个对象存储第二个对象和其他函数。(类mParse
)。 其他类和成员是不言自明的。
The mParse class. class mParse { private: list <section, allocator<section> > root; section _section; HANDLE hFile; char *fname;//path+file name unsigned char *buffer; DWORD dwBufferSize; bool condense_to_buffer(void); bool open_file(void);//just gets the buffer from given file bool free_buffer(void);//generic file open and close bool phrase_from_file(void); public: mParse(); bool get_file_en_parse(char *szFname); bool get_all_en_save(char *szFname); bool add(char *szSection, char *szName, char *szValue); bool add(char *szSection, char *szName, bool bValue); bool add(char *szSection, char *szName, int iVlaue); //TODO: bool add(char *szSection, char *szName, unsigned int uiValue) { int _iTemp = uiValue;//make it signed bool bRetval = add(szSection, szName, _iTemp); return bRetval; } bool add(char *szSection, char *szName, long lValue); bool add(char *szSection, char *szName, float fValue); bool add(char *szSection, char *szName, double dValue); bool add(char *szSection, char *szName, DWORD dwValue); bool add(char *szSection); bool del(char *szSection); bool del(char *szSection, char *szName); bool del_all(char *szSection, char *szName); bool get(char *szSection);//checks if the section is available bool get(char *szSection, char *szName, char *szReturnValue); bool get(char *szSection, char *szName, bool &bReturnValue); bool get(char *szSection, char *szName, int &iReturnValue); //TODO: bool get(char *szSection, char *szName, unsigned int &uiReturnValue) { int _iTemp = 0; bool bRetval = get(szSection, szName, _iTemp); uiReturnValue = _iTemp; return bRetval; } bool get(char *szSection, char *szName, long &lReturnValue); bool get(char *szSection, char *szName, float &fReturnValue); bool get(char *szSection, char *szName, double &dReturnValue); bool get(char *szSection, char *szName, DWORD &dwReturnValue); bool get(char *szSection, char *szName, char *szReturnValue, int iValuNo); bool set(char *szSection, char *szName, char *szValue); bool set(char *szSection, char *szName, bool bValue); bool set(char *szSection, char *szName, int iValue); //TODO: bool set(char *szSection, char *szName, unsigned int iValue) { int _iTemp = iValue; return set(szSection, szName, _iTemp); } bool set(char *szSection, char *szName, long lValue); bool set(char *szSection, char *szName, float fValue); bool set(char *szSection, char *szName, double dValue); bool set(char *szSection, char *szName, DWORD dwValue); bool set(char *szSection, char *szName, char *szValue, int iValuNo); //binary data related bool add_binary(char *szSection, char *szName, void *data, long data_size); bool get_binary(char *szSection, char *szName, void *data, long data_size); bool set_binary(char *szSection, char *szName, void *data, long data_size); bool del_binary(char *szSection, char *szNames); //comment related void add_comment(char *szComment); void add_comment(char *szComment, int iInsertPos); bool get_comment(char *szReturnValue, int iCommentNo); bool replace_comment(char *szReplaceString, int iCommentNo); bool del_comment(int iCommentNo); void del_all(void); //destroys the entire mParse };
[ ^ ]
免责声明
这只是一个演示,它可能不适合特定的需求,也不适合在程序中使用。
[ ^ ]
历史
这是一个两年前编写的小程序。 它可能包含错误,并且可能没有有效地使用STL容器。 如果在编写程序时出现一些错误,请见谅。
这是我在CodeProject上的第一篇文章...
我目前正在寻找一些人加入我的开源项目。 欢迎任何想做出贡献的人。 我的项目不是个人的,每个人都受到邀请... 我正在使用纯C/C++开发一个用于C/C++的多平台IDE,它有自己的类库、API和类。
有关详细信息,请访问 SourceForge 。