在应用程序中,经常将一些系统配置参数保存至配置文件中,以便于在系统启动时初始化用。以前用的最多的是INI格式的文件,在WINODWS操作系统中也常见到:
以C:\WINDOWS目录下的system.ini文件为例,内容如下:
; for 16-bit app support [drivers] wave=mmdrv.dll timer=timer.drv [mci] [driver32] [386enh] woafont=app936.FON EGA80WOA.FON=EGA80WOA.FON EGA40WOA.FON=EGA40WOA.FON CGA80WOA.FON=CGA80WOA.FON CGA40WOA.FON=CGA40WOA.FON
[]类似于数组括号里面的内容用于大的分类,在该分类下,以KEY-VALUE的形式用以说明参数的内容。
当配置信息分类简单、条目较少、且数据元素之前没有过多的关系时,用INI方式较为简单,
但是如果配置信息繁多,数据之间关系复杂,组织形式比较丰富的情况下,会发现以INI格式组织信息会显的力不从心。
这时可以考虑XML文件进行数据管理。XML是一种通用的标记语言,与语言无关,与操作系统平台无关,以树形方式组织数据,非常适合用来描述结构化数据。
XML 文档必须包含根元素。该元素是所有其他元素的父元素。XML 文档中的元素形成了一棵文档树。这棵树从根部开始,并扩展到树的最底端。所有元素均可拥有子元素,并一个元素也可以拥有自己的属性:
<root> <child> <subchild>.....</subchild> </child> </root>
JDK自带了对XML的支持工具,XML文件的加载、组织功能无需用户再次开发,直接调用相关类库即可。但是对于C++语言,操作系统中提供的运行时库是不支持XML的处理的,需要用户自行想办法。本文介绍一款C++下解析XML文件的工具,即TinyXML。
类之间的继承关系:
主要类的说明:(在实际编程中,使用如下几个类基本能够满足功能要求)
TiXmlAttribute | 代表一个元素的属性,以name-value的形式 |
TiXmlComment | 代表XML注释 |
TiXmlDeclaration | 文件声明,比如版本号,编码等 |
TiXmlDocument | 代表一个XML文档 |
TiXmlElement | 一个XML元素 |
std::string xmlFilePath = "D:\\Project\\param.xml"; TiXmlDocument* doc = new TiXmlDocument(); doc->LoadFile(xmlFilePath.c_str());
通过上述过程,就可以讲XML文档中的内容加载到内存中,并组织成一颗DOM树。
for (TiXmlElement* childNode = (TiXmlElement*)(root->FirstChild()); childNode != NULL; childNode = (TiXmlElement*)(root->NextSiblingElement())) { if (check(childNode)) { return childNode; } }
通过遍历某个节点的孩子节点,并检查节点的内容,判断是否符合条件
示例展示了如果创建新节点、设置节点属性并挂载的父节点中
TiXmlElement* root = doc->RootElement(); //创建新数据节点 TiXmlElement* newRecord = new TiXmlElement(XML_RECORD); newRecord->SetAttribute("phone", phoneNum); newRecord->SetAttribute("name", name); root->LinkEndChild(newRecord);
TiXmlDocument* doc; std::string xmlFilePath; doc->SaveFile(xmlFilePath);
1.采用XML可以非常灵活的自定义自组织数据;同时采用XML组织的数据可读性非常好。
2.通过TinyXML可以解决如XML文件加载及解析、节点创建挂载、文件保存等一系列工作,用户只需要根据自定义的
数据形式,把DOM树种的值提取出来即可。也可以修改DOM树上节点的值,并同步到文件中。
3. TinyXML提供了最简单也最通用的XML文件操作接口,在实际项目开发中,往往需要在此基础上,进一步结合业务
需求,定制一些直接面向应用的接口,但是往往是如下风格:
Get***Parameter(string id); Set***Parameter(string id, string val);
开发人员可以直接调用Get/Set接口,而无需关心XML文件的操作。
TinyXML下载链接:http://sourceforge.net/projects/tinyxml/