65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconemptyStarIconemptyStarIconemptyStarIcon

2.00/5 (6投票s)

2004 年 10 月 17 日

3分钟阅读

viewsIcon

27598

downloadIcon

154

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

目录

  1. 引言.
  2. 文本文件.
  3. 特点.
  4. 工作原理.
  5. 内部工作原理.
  6. 免责声明。
  7. 历史记录。
[ ^ ]

引言

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;

向其添加变量

  1. 首先添加一个section
       p.add("window_position");
  2. 向其添加变量
       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

© . All rights reserved.