Этот учебник использует XML. Обратите внимание, что библиотека не привязана к XML, и вместо нее можно использовать любой другой поддерживаемый формат (например, INI или JSON). XML был выбран потому, что автор считает, что с ним знаком широкий круг людей.
Предположим, что мы пишем систему журналирования для какого-либо приложения и должны прочитать конфигурацию журнала из файла, когда программа запускается. Файл с конфигурацией журнала выглядит так:
<debug>
<filename>debug.log</filename>
<modules>
<module>Finance</module>
<module>Admin</module>
<module>HR</module>
</modules>
<level>2</level>
</debug>
Он содержит имя файла журнала, список модулей, в которых включена регистрация, и значение уровня отладки.
Во-первых, нам нужны некоторые из них:
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
#include <boost/foreach.hpp>
#include <string>
#include <set>
#include <exception>
#include <iostream>
namespace pt = boost::property_tree;
Для сохранения конфигурации журнала в программе мы создаем структуру debug_settings:
struct debug_settings
{
std::string m_file;
int m_level;
std::set<std::string> m_modules;
void load(const std::string &filename);
void save(const std::string &filename);
};
Все, что нужно сделать сейчас, это записать реализации функций загрузки () и сохранения (). Давайте сначала разберемся с нагрузкой(). Он содержит всего 7 строк кода, хотя он делает все необходимые вещи, включая отчет об ошибках:
void debug_settings::load(const std::string &filename)
{
pt::ptree tree;
pt::read_xml(filename, tree);
m_file = tree.get<std::string>("debug.filename");
m_level = tree.get("debug.level", 0);
BOOST_FOREACH(pt::ptree::value_type &v, tree.get_child("debug.modules")) {
m_modules.insert(v.second.data());
}
}
Теперь функция сохранения(). Это также 7 строк кода:
void debug_settings::save(const std::string &filename)
{
pt::ptree tree;
tree.put("debug.filename", m_file);
tree.put("debug.level", m_level);
BOOST_FOREACH(const std::string &name, m_modules)
tree.add("debug.modules.module", name);
pt::write_xml(filename, tree);
}
Полная программаdebug_settings.cppвключен в каталог примеров.