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

在 XML 中读写应用程序参数

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.38/5 (30投票s)

2001年5月1日

4分钟阅读

viewsIcon

2259631

downloadIcon

6832

本文提供了一种简单的方法,用于在 XML 格式中加载和保存应用程序的参数。

Sample Image - maximum width is 600 pixels

引言

本文提供了一种简单的方法,用于在 XML 格式中加载和保存应用程序的参数。

XML 是一种处理应用程序参数的便捷格式,原因如下:

  • 它是文本格式,因此您可以轻松地检查这些值并使用经典编辑器对其进行修改(顺便说一句,IE 5.0 以非常好的方式显示 XML)。
  • 它基于树结构,因此您可以以结构化的方式保存参数。
  • 它是平台和语言无关的。
我的目标不是解析 XML 文件,而是提供一种读取和写入数据的简单方法。 因此,该代码基于 David Hubbard 的一个简单的基于 STL 的 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 是一个模板方法,因此你可以写入几乎任何类型的变量,从 intstd::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 的建议,添加了一个方法来删除节点或整个子树。
© . All rights reserved.