尝试使用wptree来进行xml解析,又一次失败了,可以正常读取正常输出,但是使用wptree进行节点读取失败(乱码)
请看源码:
DealXml.h
1 #pragma once 2 3 #include <string> 4 5 #include <boost/property_tree/ptree.hpp> 6 7 struct TestData 8 { 9 int var_int; 10 std::string var_string; 11 std::wstring var_wstring; 12 13 }; 14 15 class DealXml 16 { 17 public: 18 typedef boost::property_tree::ptree ptree_type; 19 typedef boost::property_tree::wptree wptree_type; 20 DealXml(void); 21 ~DealXml(void); 22 23 bool read_xmlW(std::basic_istream<wptree_type::key_type::value_type>& bis); 24 bool write_xmlW(std::basic_ostream<wptree_type::key_type::value_type>& bos); 25 bool open_file_and_read_xmlW(const std::string &filepath); 26 bool open_file_and_write_xmlW(const std::string &filepath); 27 private: 28 ptree_type pt; 29 wptree_type wpt; 30 TestData m_TestData; 31 };
DealXml.cpp
1 #include "DealXml.h" 2 3 #include <iostream> 4 #include <fstream> 5 #include <string> 6 7 #include <boost/property_tree/xml_parser.hpp> 8 #include <boost/property_tree/detail/xml_parser_flags.hpp> 9 #include <boost/foreach.hpp> 10 11 using namespace std; 12 using namespace boost; 13 14 DealXml::DealXml(void) 15 { 16 } 17 18 19 DealXml::~DealXml(void) 20 { 21 } 22 23 bool DealXml::read_xmlW(std::basic_istream<wptree_type::key_type::value_type>& bis) 24 { 25 bool is_success = false; 26 27 do 28 { 29 try 30 { 31 boost::property_tree::xml_parser::read_xml(bis, wpt, boost::property_tree::xml_parser::no_concat_text|boost::property_tree::xml_parser::trim_whitespace); 32 33 std::wstring wstr_test = wpt.get<std::wstring>(L"root.<xmlattr>.value"); 34 35 BOOST_FOREACH( wptree_type::value_type &v, wpt.get_child(L"root") ) 36 { 37 if ( L"ceng1"==v.first ) 38 { 39 //无法获取xml数据 40 m_TestData.var_wstring = v.second.get_value<std::wstring>(L"ceng1"); 41 m_TestData.var_wstring = v.second.get_value<std::wstring>(); 42 //wchar_t *p = v.second.get_value<wchar_t*>(L"ceng1"); 43 //m_TestData.var_wstring = v.second.get<std::wstring>(L"ceng1"); 44 //m_TestData.var_int = v.second.get_value<int>(L"ceng1"); 45 //m_TestData.var_string = v.second.get_value<std::string>(L"ceng1"); 46 //std::cout << v.second.get_value<std::wstring>(L"ceng1") << std::endl; 47 std::wcout << v.second.get_value<std::wstring>(L"ceng1") << std::endl; 48 is_success = true; 49 } 50 } 51 52 } 53 catch(const std::exception &e) 54 { 55 std::cout << e.what() << std::endl; 56 } 57 58 59 } while (false); 60 61 return is_success; 62 } 63 bool DealXml::write_xmlW(std::basic_ostream<wptree_type::key_type::value_type>& bos) 64 { 65 bool is_success = false; 66 67 do 68 { 69 try 70 { 71 boost::property_tree::xml_parser::xml_writer_settings<wchar_t> settings(L‘\t‘, 1, L"utf-8"); 72 boost::property_tree::xml_parser::write_xml<wptree_type>(bos, wpt, settings); 73 } 74 catch(const std::exception &e) 75 { 76 std::cout << e.what() << std::endl; 77 } 78 79 80 } while (false); 81 82 return is_success; 83 } 84 bool DealXml::open_file_and_read_xmlW(const std::string &filepath) 85 { 86 bool is_success = false; 87 88 do 89 { 90 try 91 { 92 std::basic_filebuf<wchar_t> bfb; 93 if (bfb.open(filepath.c_str(), std::ios::in)) 94 { 95 std::basic_istream<wchar_t> bis(&bfb); 96 read_xmlW(bis); 97 bfb.close(); 98 is_success = true; 99 } 100 } 101 catch(const std::exception &e) 102 { 103 std::cout << e.what() << std::endl; 104 } 105 106 107 } while (false); 108 109 return is_success; 110 } 111 bool DealXml::open_file_and_write_xmlW(const std::string &filepath) 112 { 113 bool is_success = false; 114 115 do 116 { 117 try 118 { 119 std::basic_filebuf<wchar_t> bfb; 120 if (bfb.open(filepath.c_str(), std::ios::out)) 121 { 122 std::basic_ostream<wchar_t> bos(&bfb); 123 write_xmlW(bos); 124 bfb.close(); 125 is_success = true; 126 } 127 } 128 catch(const std::exception &e) 129 { 130 std::cout << e.what() << std::endl; 131 } 132 133 134 } while (false); 135 136 return is_success; 137 }
boost::xml————又一次失败的尝试,布布扣,bubuko.com
原文地址:http://www.cnblogs.com/superstargg/p/3848311.html