boost::xml————又一次失败的尝试

尝试使用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)