读写XML文件:
testConfigRead.xml
<?xml version="1.0" encoding="GB2312"?>
<content>
<title value="xxxx"/>
<number>1234</number>
<groups>
<class num="1" type="type1"/>
<class num="2" type="type2"/>
<class num="3" type="type3"/>
</groups>
<classes>
<name>first</name>
<name>second</name>
<name>third</name>
</classes>
</content>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
#include <boost/foreach.hpp>
#include <boost/typeof/std/utility.hpp>
#include <string>
#include <map>
#include <set>
#include <exception>
#include <iostream>
struct TestConfig
{
std::string title;
int number;
std::map<int, std::string> groups;
std::set<std::string> classes;
void load(const std::string& filename);
void save(const std::string& filename);
};
void TestConfig::load(const std::string& filename)
{
using boost::property_tree::ptree;
ptree pt;
read_xml(filename, pt, boost::property_tree::xml_parser::trim_whitespace);
title = pt.get_child("content.title").get<std::string>("<xmlattr>.value");
std::cout << title << std::endl;
number = pt.get<int>("content.number");
std::cout << number << std::endl;
ptree &groups_node = pt.get_child("content.groups");
BOOST_FOREACH(const ptree::value_type& vt, groups_node)
{
std::string num = vt.second.get<std::string>("<xmlattr>.num");
std::string type = vt.second.get<std::string>("<xmlattr>.type");
groups.insert(std::pair<int, std::string>(atoi(num.c_str()), type));
std::cout << num << "," << type << std::endl;
}
ptree &classes_node = pt.get_child("content.classes");
BOOST_FOREACH(const ptree::value_type& vt, classes_node)
{
classes.insert(vt.second.data());
std::cout << vt.second.data() << std::endl;
}
}
void TestConfig::save(const std::string& filename)
{
using boost::property_tree::ptree;
ptree pt, pattr1;
pattr1.add<std::string>("<xmlattr>.value", title);
pt.add_child("content.title", pattr1);
pt.put("content.number", number);
typedef std::map<int, std::string> map_type;
BOOST_FOREACH(const map_type::value_type &grp, groups)
{
ptree pattr2;
pattr2.add<int>("<xmlattr>.num", grp.first);
pattr2.add<std::string>("<xmlattr>.type", grp.second);
pt.add_child("content.groups.class", pattr2);
}
BOOST_FOREACH(const std::string& cls, classes)
{
pt.add("content.classes.name", cls);
}
// 格式化输出,指定编码(默认utf-8)
boost::property_tree::xml_writer_settings<char> settings('\t', 1, "GB2312");
write_xml(filename, pt, std::locale(), settings);
}
int main()
{
try
{
TestConfig tc;
tc.load("testConfigRead.xml");
tc.save("testConfigWrite.xml");
std::cout << "Success\n";
}
catch (std::exception &e)
{
std::cout << "Error: " << e.what() << "\n";
}
system("pause");
return 0;
}