boost 轻量化xml封装

最近项目实在是太忙了~

恩 此封装在一般使用频率不大的键值对应配置, 要复杂的结构还是要编写XML对应生成代码工具比较方便和高效

  1 #pragma once
  2 #include <enable_hashmap.h>
  3 #include <string>
  4 #include <boost/property_tree/ptree.hpp>
  5 #include <boost/property_tree/xml_parser.hpp> 
  6 #include <boost/lexical_cast.hpp>
  7 
  8 class enable_xml_config
  9 {
 10 public:
 11     enable_xml_config():b_init(false)
 12     {
 13     }
 14     bool init(const std::string& filename)
 15     {        
 16         boost::property_tree::ptree root;
 17         try
 18         {
 19             boost::property_tree::xml_parser::read_xml(filename, pt, boost::property_tree::xml_parser::trim_whitespace);
 20             root = pt.get_child("root");
 21             filepath = filename;
 22         }
 23         catch (...)
 24         {
 25             return false;
 26         }
 27         value_map.clear();
 28         for (auto itr = root.begin(); itr!=root.end(); ++itr)
 29         {
 30             value_map.insert(std::make_pair(itr->first, itr->second.data()));
 31         }
 32         b_init = true;
 33         return b_init;
 34     }
 35 
 36     bool check(const std::string& skey) {
 37         auto it = value_map.find(skey);
 38         if(it == value_map.end())
 39             return false;
 40         return true;
 41     }
 42 
 43     template<class T>
 44     T get(const std::string& skey) {
 45         try
 46         {
 47             if(check(skey))
 48                 return boost::lexical_cast<T>(value_map[skey]);    
 49         }
 50         catch (...)
 51         {
 52         }
 53         return T();
 54     }
 55 
 56     template<class T>
 57     T get_ex(const std::string& skey, T& def_val = T()) {
 58         try
 59         {
 60             if(check(skey))
 61                 return boost::lexical_cast<T>(value_map[skey]);    
 62         }
 63         catch (...)
 64         {
 65         }
 66         return def_val;
 67     }
 68 
 69     bool save()
 70     {
 71         if(!b_init)
 72             return false;
 73 
 74         try
 75         {
 76             boost::property_tree::ptree& root = pt.get_child("root");
 77             for (auto itr = root.begin(); itr!=root.end(); ++itr)
 78             {
 79                 auto it = value_map.find(itr->first);
 80                 if (it != value_map.end())
 81                 {
 82                     itr->second.data() = it->second;
 83                 }
 84             }
 85             boost::property_tree::xml_writer_settings<char> settings('\t', 1); 
 86             boost::property_tree::xml_parser::write_xml(filepath, pt,std::locale(), settings);
 87         }
 88         catch (...)
 89         {
 90             return false;
 91         }
 92 
 93         return true;
 94     }
 95 private:
 96     ENABLE_MAP<std::string, std::string> value_map;
 97     boost::property_tree::ptree pt;
 98     std::string filepath;
 99     bool b_init;
100 };
enable_xml_config.h

附带:

1 #pragma once
2 #ifdef _DEBUG
3 #include <map>
4 #define ENABLE_MAP std::map
5 #else
6 //效率比map高很多 但是无法查看数据 并且无序
7 #include <boost/unordered_map.hpp>
8 #define ENABLE_MAP boost::unordered_map
9 #endif
enable_hashmap.h

 

posted @ 2014-05-17 12:56  飞鱼云  阅读(451)  评论(0编辑  收藏  举报