在 XML 中读写应用程序参数






4.38/5 (30投票s)
2001年5月1日
4分钟阅读

2259631

6832
本文提供了一种简单的方法,用于在 XML 格式中加载和保存应用程序的参数。
引言
本文提供了一种简单的方法,用于在 XML 格式中加载和保存应用程序的参数。
XML 是一种处理应用程序参数的便捷格式,原因如下:
- 它是文本格式,因此您可以轻松地检查这些值并使用经典编辑器对其进行修改(顺便说一句,IE 5.0 以非常好的方式显示 XML)。
- 它基于树结构,因此您可以以结构化的方式保存参数。
- 它是平台和语言无关的。
该代码完全基于 STL。 它也可以在 Linux 上编译。 我想它将在任何支持 STL 的平台/编译器上编译。
使用代码
现在让我们举一个例子来更精确地解释你可以用 ParamIO 做什么。 假设你有一个应用程序在屏幕上以给定的颜色和字体显示一些文本(演示项目)。 你的应用程序的参数将是文本(1 个字符串)、颜色(3 个 RGB 值)和字体(1 个字符串表示字体名称,1 个 double 表示字体大小)。 你希望能够将这些参数保存在磁盘上,并在以后使用时加载它们。 一个包含这些值的漂亮的 XML 文件可能如下所示:
<PARAMS> <TEXT>Hello world</TEXT> <COLOR> <RED>50</RED> <GREEN>128</GREEN> <BLUE>255</BLUE> </COLOR> <FONT> <NAME>Arial</NAME> <SIZE>12.0</SIZE> </FONT> </PARAMS>假设我们在应用程序中有以下变量:
std::string _text; // The text int _red, _green, _blue; // color std::string _fontName; // font name double _fontSize; // font size用于写入先前文件的代码将是:
ParamIO outXml; outXml.write("PARAMS:TEXT", _text); outXml.write("PARAMS:COLOR:RED", _red); outXml.write("PARAMS:COLOR:GREEN", _green); outXml.write("PARAMS:COLOR:BLUE", _blue); outXml.write("PARAMS:FONT:NAME", _fontName); outXml.write("PARAMS:FONT:SIZE", _fontSize); outXml.writeFile("filename.xml"); // Finally write the file to disk正如你所看到的,它非常简单。 在
write
方法中,第一个参数是一个 char*
,它定义了 XML 树中的位置。 这类似于 XPath,但我在编写此代码时并不知道 XPath,如果我知道,我会使用“/”代替。 第二个参数给出你要写入的值。 write
是一个模板方法,因此你可以写入几乎任何类型的变量,从 int
到 std::string
。 读取文件也很简单:ParamIO inXml; inXml.readFile("filename.xml"); // Read the file from disk inXml.read("PARAMS:TEXT", _text, std::string("Hello world")); inXml.read("PARAMS:COLOR:RED", _red, 0); inXml.read("PARAMS:COLOR:GREEN", _green, 0); inXml.read("PARAMS:COLOR:BLUE", _blue, 0); inXml.read("PARAMS:FONT:NAME", _fontName, std::string("Arial")); inXml.read("PARAMS:FONT:SIZE", _fontSize, 12.0);你可能会对
read
方法的第三个参数感到惊讶。 这是什么意思? 它是你尝试读取的参数的默认值。 假设你要读取像之前的文件,并且没有指定字体的大小,那么 _fontSize
将自动设置为其默认值 12.0。 当你有同一个应用程序的几个版本,并且某些版本有在旧版本中不存在的参数时,这是一个非常有用的行为。 它确保你仍然可以读取旧文件,并用默认值填充缺失的值。 它还允许你加载一个不存在的文件,并将所有参数设置为它们的默认值。ParamIO 还允许你读取和写入来自流的 XML,如果你想让一些应用程序通过套接字交换数据,这应该很有用。
演示应用程序包含一个 XML 对话框。 使用这个对话框 (CXML_Dialog
),你可以可视化和修改任何 XML 树。 我经常使用它,它工作得非常好。 如果你的参数名称包含 FILENAME(例如 FONT_FILENAME
),你将看到一个按钮出现,如果你点击它,你将获得一个打开文件对话框,你可以在其中找到你的文件。 我经常使用这个 CXML_Dialog
对话框,我对此非常满意,它工作得非常好。 CXML_Dialog 使用 Lee Nowotny 的 Easy Navigation Through an Editable List View 中的一个类。 我非常感谢他的工作,它工作得非常完美。
如果你有任何意见、建议或改进,请告诉我。
历史
2002 年 11 月 20 日:带有 GUI 演示的第一个版本,具有比较功能
2003 年 6 月 20 日
- 修改了网站,添加了不带 GUI 演示的 src 下载
- 感谢 Paul Kissel 添加了对 MFC
CString
的支持:要启用CString
读/写,只需在编译选项中定义_PARAMIO_CSTRING_SUPPORT_
。 - 感谢 Ogi 的建议,添加了一个方法来删除节点或整个子树。