因爱智能

boost xml读写

http://blog.csdn.net/tujiaw/article/details/8065562


读写XML文件:

testConfigRead.xml

[html] view plaincopy

  1. <?xml version="1.0" encoding="GB2312"?>  
  2. <content>  
  3.   <title value="xxxx"/>  
  4.   <number>1234</number>  
  5.   <groups>  
  6.     <class num="1" type="type1"/>  
  7.     <class num="2" type="type2"/>  
  8.     <class num="3" type="type3"/>  
  9.   </groups>  
  10.   <classes>  
  11.     <name>first</name>  
  12.     <name>second</name>  
  13.     <name>third</name>  
  14.   </classes>  
  15. </content>  

[cpp] view plaincopy

  1. #include <boost/property_tree/ptree.hpp>  
  2. #include <boost/property_tree/xml_parser.hpp>  
  3. #include <boost/foreach.hpp>  
  4. #include <boost/typeof/std/utility.hpp>  
  5. #include <string>  
  6. #include <map>  
  7. #include <set>  
  8. #include <exception>  
  9. #include <iostream>  
  10.   
  11. struct TestConfig  
  12. {  
  13.     std::string title;  
  14.     int number;  
  15.     std::map<int, std::string> groups;  
  16.     std::set<std::string> classes;  
  17.     void load(const std::string& filename);  
  18.     void save(const std::string& filename);  
  19. };  
  20.   
  21. void TestConfig::load(const std::string& filename)  
  22. {  
  23.     using boost::property_tree::ptree;  
  24.     ptree pt;  
  25.     read_xml(filename, pt, boost::property_tree::xml_parser::trim_whitespace);  
  26.   
  27.     title = pt.get_child("content.title").get<std::string>("<xmlattr>.value");  
  28.     std::cout << title << std::endl;  
  29.   
  30.     number = pt.get<int>("content.number");  
  31.     std::cout << number << std::endl;  
  32.   
  33.     ptree &groups_node = pt.get_child("content.groups");  
  34.     BOOST_FOREACH(const ptree::value_type& vt, groups_node)  
  35.     {  
  36.         std::string num = vt.second.get<std::string>("<xmlattr>.num");  
  37.         std::string type = vt.second.get<std::string>("<xmlattr>.type");  
  38.         groups.insert(std::pair<int, std::string>(atoi(num.c_str()), type));  
  39.         std::cout << num << "," << type << std::endl;  
  40.     }  
  41.   
  42.     ptree &classes_node = pt.get_child("content.classes");  
  43.     BOOST_FOREACH(const ptree::value_type& vt, classes_node)  
  44.     {  
  45.         classes.insert(vt.second.data());  
  46.         std::cout << vt.second.data() << std::endl;  
  47.     }  
  48. }  
  49.   
  50. void TestConfig::save(const std::string& filename)  
  51. {  
  52.     using boost::property_tree::ptree;  
  53.     ptree pt, pattr1;  
  54.   
  55.     pattr1.add<std::string>("<xmlattr>.value", title);  
  56.     pt.add_child("content.title", pattr1);  
  57.     pt.put("content.number", number);  
  58.   
  59.     typedef std::map<int, std::string> map_type;  
  60.     BOOST_FOREACH(const map_type::value_type &grp, groups)  
  61.     {  
  62.         ptree pattr2;  
  63.         pattr2.add<int>("<xmlattr>.num", grp.first);  
  64.         pattr2.add<std::string>("<xmlattr>.type", grp.second);  
  65.         pt.add_child("content.groups.class", pattr2);  
  66.     }  
  67.       
  68.     BOOST_FOREACH(const std::string& cls, classes)  
  69.     {  
  70.         pt.add("content.classes.name", cls);  
  71.     }  
  72.       
  73.     // 格式化输出,指定编码(默认utf-8)  
  74.     boost::property_tree::xml_writer_settings<char> settings('\t', 1, "GB2312");  
  75.     write_xml(filename, pt, std::locale(), settings);  
  76. }  
  77.   
  78.   
  79. int main()  
  80. {  
  81.     try  
  82.     {  
  83.         TestConfig tc;  
  84.         tc.load("testConfigRead.xml");  
  85.         tc.save("testConfigWrite.xml");  
  86.         std::cout << "Success\n";  
  87.     }  
  88.     catch (std::exception &e)  
  89.     {  
  90.         std::cout << "Error: " << e.what() << "\n";  
  91.     }  
  92.   
  93.     system("pause");  
  94.     return 0;  
  95. }  

评论

热度(1)