Read and Write application parameters in XML






4.38/5 (30 votes)
May 1, 2001
4 min read

1856334

6832
This article provides an easy way to load and save the parameters of an application in XML format.
Introduction
This article provides an easy way to load and save the parameters of an application in XML format.
XML is a convenient format to deal with the parameters of applications for the following reasons:
- It's text, so you can easily check the values and modify them with a classical editor (by the way, IE 5.0 shows XML in a very nice way).
- It's based on a tree so you can have your parameters saved in a structured way.
- It's platform and language independent.
The code is entirely based on STL. It compiles on linux, too. I guess it will compile on any other platform/compiler that supports STL.
Using the code
Now let's take an example to explain more precisely what you can do with ParamIO. Let's assume you have an application to show some text on the screen in a given color and in a given font (the demo project). The parameters of your application will be the text (1 string), the color (3 values RGB) and the font (1 string for the font name and 1 double for the font size). You want to be able to save those parameters on the disk and load them for a later use. A nice XML file containing those values can look like this:
<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>Let's say we have the following variables in the application :
std::string _text; // The text int _red, _green, _blue; // color std::string _fontName; // font name double _fontSize; // font sizeThe code to write the previous file will be :
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 diskAs you can see, it's very easy. In the
write
method, the first parameter is a char*
that defines the position in the XML tree. This is similar to XPath, but I didn't know XPath at the time I wrote this code, I would have used the '/' instead if I had known. The second parameter gives the value you want to write. write
is a templated method so you can write almost any kind of variable, from int
to std::string
. Reading the file is also straightforward : 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);You may be surprised by the third parameter of the
read
method. What does it mean? It's the default value of the parameter you try to read. Imagine you want to read a file like the previous one and the size of the font is not specified, then _fontSize
will be automatically set to its default value 12.0. It's a very useful behaviour when you have several versions of a same application and some versions have parameters that didn't exist in older ones. It ensures that you still can read the old files, filling the missing values with default ones. It also lets you load a file that doesn't exist and set all the parameters with their default values.
ParamIO lets you read and write XML coming from streams also, it should be useful if you want some applications to exchange data through sockets for example.
The demo application includes a XML dialog box. With this dialog box (CXML_Dialog
), you can visualise and modify any XML tree. I used it a lot, it's working really well. In case your parameter name contains FILENAME inside (e.g FONT_FILENAME
), you'll see a button appear, and if you click on it, you'll obtain an open file dialog where you can find your file. I used this CXML_Dialog
dialog box a lot and I'm very happy about it, it works really fine. CXML_Dialog uses a class from Easy Navigation Through an Editable List View by Lee Nowotny. I really thank him for the job, it works perfectly.
If you have any comments, suggestions or improvements let me know.
History
20 Nov 2002 : first version with GUI demo, with comparison capabilities
20 June 2003:
- modified the website, added src download without the GUI demo
- Added support for MFC
CString
has been added thanks to Paul Kissel : to enableCString
read/write, just define_PARAMIO_CSTRING_SUPPORT_
in the compilation options. - Added a method to erase a node or an entire subtree as been added, thanks to Ogi's suggestion.