下面是本人使用boost库的xml部分的基础操作,并且解决对于大家使用boost库读写中文xml内容出现的乱码问题。

1.实现boost库xml基本操作
2.解决boost对xml中中文乱码问题
3.实现普通字符串和宽字符串的傻瓜切换(模仿tchar.h)
4.代码运行环境为VS2010,需要导入boost库才能正常运行
5.VS2010运行时可能会发生错误。例如:cl.exe 或者 cvtres.exe 报错。 解决办法就是重新打开项目或者切换其它正常项目运行一下(反正我是这么解决的)

下面是源码部分。

注:为了说明问题使用一个cpp文件完成所有操作。

  1. /*实现单字节和宽字节的自动转换*/
  2.  
  3. //note_1: G prefix is global meaning
  4. //note_2: template<typename type> ,type only support tstring, can't support int and so on.
  5. //note_3: In VS2010 update1, it maybe encounter bug for VS2010 self. example: "error MSB6006: CL.exe" or "LINK : fatal error LNK1158: cvtres.exe", solution is reopen project
  6. //note_4: switch std::string and std::wstring in use macro CHINESE_CHARSET. The major solution is chinese unreadable code with xml file
  7.  
  8. //Windows API
  9. //#include <tchar.h>
  10. //#include <wchar.h>
  11.  
  12. //C++ standard template library
  13. #include <iostream>
  14. #include <string>
  15. #include <exception>
  16. #include <map>
  17.  
  18. //third library head files
  19. #include <boost/property_tree/ptree.hpp>
  20. #include <boost/property_tree/xml_parser.hpp>
  21. #include <boost/program_options/detail/convert.hpp>
  22. #include <boost/program_options/detail/utf8_codecvt_facet.hpp>
  23. #include <boost/foreach.hpp>
  24.  
  25. using namespace std;
  26. using namespace boost;
  27. using namespace boost::property_tree;
  28.  
  29. #define CHINESE_CHARSET //控制处理宽字符还是单字节字符,其中宽字符可以对中文进行支持
  30.  
  31. #ifdef CHINESE_CHARSET
  32. #define tptree boost::property_tree::wptree
  33. #define tstring std::wstring
  34. #define _USERT(x) L ## x
  35. #else
  36. #define tptree boost::property_tree::ptree
  37. #define tstring std::string
  38. #define _USERT(x) x
  39. #endif
  40.  
  41. bool LoadXML(tptree &o_pt, const string i_strFileName)
  42. {
  43. //set locale
  44. #ifdef CHINESE_CHARSET
  45. std::locale current_locale(locale(""), new boost::program_options::detail::utf8_codecvt_facet());
  46. #else
  47. std::locale current_locale;
  48. #endif
  49.  
  50. //read xml
  51. try
  52. {
  53. boost::property_tree::read_xml(i_strFileName, o_pt, boost::property_tree::xml_parser::trim_whitespace, current_locale);
  54. }
  55. catch (const std::exception &e)
  56. {
  57. cout << "Error:" << typeid(e).name() << ": ";
  58. cout << e.what() << endl;
  59. return false;
  60. }
  61.  
  62. return true;
  63. }
  64.  
  65. bool SaveXML(const tptree &i_pt, const string i_strFileName)
  66. {
  67. //set locale
  68. #ifdef CHINESE_CHARSET
  69. std::locale current_locale(locale(""), new boost::program_options::detail::utf8_codecvt_facet());
  70. boost::property_tree::xml_parser::xml_writer_settings<wchar_t> settings(L'\t', , L"utf-8");
  71. #else
  72. std::locale current_locale;
  73. boost::property_tree::xml_parser::xml_writer_settings<char> settings('\t', , "utf-8");
  74. #endif
  75.  
  76. try
  77. {
  78. boost::property_tree::write_xml(i_strFileName, i_pt, current_locale, settings);
  79. }
  80. catch (const std::exception &e)
  81. {
  82. cout << "Error:" << typeid(e).name() << ": ";
  83. cout << e.what() << endl;
  84. return false;
  85. }
  86.  
  87. return true;
  88. }
  89.  
  90. //是否存在直接子节点或者属性,返回-1:出现错误;返回0:没有子节点或者属性;返回1:有属性或者有子节点
  91. int IsExistChildNode(const tptree &i_pt, const tstring i_strNodePath)
  92. {
  93. try
  94. {
  95. const tptree pt = i_pt.get_child(i_strNodePath);
  96. if (pt.empty())
  97. {
  98. return ; //no child
  99. }
  100. else
  101. {
  102. return ; //have child or attribute
  103. }
  104. }
  105. catch (const std::exception &e)
  106. {
  107. cout << "Error:" << typeid(e).name() << ": ";
  108. cout << e.what() << endl;
  109. return -; //error: exception
  110. }
  111.  
  112. return -;
  113. }
  114.  
  115. //查看是否有子节点或者属性,如果没有则返回false,如果有则返回true
  116. //通过o_nChildNodeCount和o_nChildNodeAttributeCount返回数目
  117. //通过o_bChildNodeOrAttribute判断是直接子节点还是属性:true直接子节点;false属性
  118. bool IsChildNodeOrAttr(const tptree &i_pt
  119. , const tstring i_strNodePath
  120. , bool &o_bChildNodeOrAttribute
  121. , int &o_nChildNodeCount //直接子节点数目
  122. , int &o_nChildNodeAttributeCount) //直接子节点属性数目
  123. {
  124. o_bChildNodeOrAttribute = false; //initialize
  125. o_nChildNodeCount = ; //initialize child node count
  126. o_nChildNodeAttributeCount = ; //initialize attribute count
  127.  
  128. tstring l_strChildNode; //local object
  129. tstring l_strXmlAttr(_USERT("<xmlattr>")); //with l_strChildNode
  130. tstring l_strAttrPath(_USERT(".<xmlattr>")); //mark <xmlattr>
  131. bool l_bflag = true; //valve
  132.  
  133. try
  134. {
  135. int l_bExistChildNode = IsExistChildNode(i_pt, i_strNodePath);
  136. if (==l_bExistChildNode)
  137. {
  138. return false; //no child node or attribute
  139. }
  140. BOOST_FOREACH (const tptree::value_type &v, i_pt.get_child(i_strNodePath))
  141. {
  142. l_strChildNode = v.first.data();
  143. if (l_strChildNode==l_strXmlAttr && true==l_bflag)
  144. {
  145. BOOST_FOREACH (const tptree::value_type &v, i_pt.get_child(i_strNodePath+l_strAttrPath))
  146. {
  147. ++o_nChildNodeAttributeCount;
  148. o_bChildNodeOrAttribute = false; //is attribute
  149. }
  150. l_bflag = false;
  151. }
  152. else
  153. {
  154. ++o_nChildNodeCount;
  155. o_bChildNodeOrAttribute = true; //is child node
  156. }
  157. }
  158. return true;
  159. }
  160. catch (const std::exception &e)
  161. {
  162. cout << "Error:" << typeid(e).name() << ": ";
  163. cout << e.what() << endl;
  164. return false; //error: exception
  165. }
  166.  
  167. return false;
  168. }
  169.  
  170. //返回获取直接子节点是否完成:false:获取失败;true:获取成功
  171. //获取的直接子节点保存在o_mapChildNode容器中
  172. //注意:使用前请先确认是否有直接子节点,可以调用IsChildNodeOrAttr查看o_bChildNodeOrAttribute
  173. template<typename type> bool GetChildNodes(const tptree &i_pt, const tstring i_strNodePath, multimap<tstring, type> &o_mmapChildNodes)
  174. {
  175. tstring l_strChildNode;
  176. tstring l_strXmlAttr(_USERT("<xmlattr>")); //with l_strChildNode
  177. type l_tpChildNodeValue;
  178.  
  179. try
  180. {
  181. int l_bExistChildNode = IsExistChildNode(i_pt, i_strNodePath);
  182. if (==l_bExistChildNode)
  183. {
  184. return false; //no child node or attribute
  185. }
  186. BOOST_FOREACH (const tptree::value_type &v, i_pt.get_child(i_strNodePath))
  187. {
  188. l_strChildNode = v.first.data();
  189. l_tpChildNodeValue = v.second.get_value<type>();
  190. if (!=l_strChildNode.compare(l_strXmlAttr))
  191. {
  192. o_mmapChildNodes.insert(pair<tstring, type>(l_strChildNode, l_tpChildNodeValue));
  193. }
  194. else
  195. {
  196. throw runtime_error("This node include with attribute.\nPlease call IsChildNodeOrAttr function before.");
  197. }
  198. }
  199. }
  200. catch (const std::exception &e)
  201. {
  202. cout << "Error:" << typeid(e).name() << ": ";
  203. cout << e.what() << endl;
  204. return false; //error: exception
  205. }
  206.  
  207. return false;
  208. }
  209.  
  210. //返回获取当前节点属性是否完成:false:获取失败;true:获取成功
  211. //获取的当前节点属性保存在o_mapCurrentNodeAttrs容器中
  212. //注意:使用前请先确认当前节点是否有属性,可以调用IsChildNodeOrAttr查看o_bChildNodeOrAttribute
  213. template<typename type> bool GetCurrentNodeAttrs(const tptree &i_pt, const tstring i_strNodePath, map<tstring, type> &o_mapCurrentNodeAttrs)
  214. {
  215. tstring l_strChildNodeAttr;
  216. tstring l_strXmlAttr(_USERT("<xmlattr>")); //with l_strChildNode
  217. tstring l_strAttrPath(_USERT(".<xmlattr>")); //mark <xmlattr>
  218. type l_tpChildNodeAttrValue;
  219.  
  220. try
  221. {
  222. int l_bExistChildNode = IsExistChildNode(i_pt, i_strNodePath);
  223. if (==l_bExistChildNode)
  224. {
  225. return false; //no child node or attribute
  226. }
  227. if (l_strXmlAttr==i_pt.get_child(i_strNodePath).begin()->first.data())
  228. {
  229. BOOST_FOREACH (const tptree::value_type &v, i_pt.get_child(i_strNodePath+l_strAttrPath))
  230. {
  231. l_strChildNodeAttr = v.first.data();
  232. l_tpChildNodeAttrValue = v.second.get_value<type>();
  233. o_mapCurrentNodeAttrs.insert(pair<tstring, type>(l_strChildNodeAttr, l_tpChildNodeAttrValue));
  234. }
  235. return true;
  236. }
  237. else
  238. {
  239. throw runtime_error("This node exclude with attribute.\nPlease call IsChildNodeOrAttr function before.");
  240. }
  241. }
  242. catch (const std::exception &e)
  243. {
  244. cout << "Error:" << typeid(e).name() << ": ";
  245. cout << e.what() << endl;
  246. return false; //error: exception
  247. }
  248.  
  249. return false;
  250. }
  251.  
  252. //返回获取当前节点的直接子节点属性是否完成:false:获取失败;true:获取成功
  253. //获取的当前节点的直接子节点属性保存在o_mapChildNodesAttr容器中
  254. //注意:使用前请先确认当前节点的直接子节点是否有属性,可以调用IsChildNodeOrAttr查看o_bChildNodeOrAttribute
  255. //注意:本功能只应用在当前节点的多个直接子节点具有相同节点名的情况,对于多个直接子节点具有不同节点名情况不适用
  256. template<typename type> bool GetChildNodesAttrs(const tptree &i_pt, const tstring i_strNodePath, multimap<tstring, map<tstring, type>> &o_mmapChildNodesAttrs)
  257. {
  258. tstring l_strChildNode;
  259. tstring l_strChildNodeAttr;
  260. type l_tpChildNodeAttrValue;
  261. tstring l_strXmlAttr(_USERT("<xmlattr>")); //with l_strChildNode
  262. tstring l_strAttrPath(_USERT(".<xmlattr>")); //mark <xmlattr>
  263.  
  264. try
  265. {
  266. int l_bExistChildNode = IsExistChildNode(i_pt, i_strNodePath); //check child node
  267. if (==l_bExistChildNode)
  268. {
  269. return false; //no child node
  270. }
  271.  
  272. //tstring l_strChildNode = i_pt.get_child(i_strNodePath).begin()->first.data();
  273. tstring l_strChildNode = i_pt.get_child(i_strNodePath).front().first.data();
  274. tstring l_strChildNodeAttrPath = i_strNodePath+_USERT(".")+l_strChildNode+l_strAttrPath;
  275. int l_bExistChildNodeAttr = IsExistChildNode(i_pt, l_strChildNodeAttrPath); //check child node attribute
  276. if (==l_bExistChildNodeAttr)
  277. {
  278. return false; //no child node attribute
  279. }
  280.  
  281. BOOST_FOREACH (const tptree::value_type &v, i_pt.get_child(i_strNodePath))
  282. {
  283. map<tstring, type> l_mapChildNodeAttrs;
  284. l_strChildNode = v.first.data();
  285. BOOST_FOREACH (const tptree::value_type &subv, v.second.get_child(l_strXmlAttr))
  286. {
  287. l_strChildNodeAttr = subv.first.data();
  288. l_tpChildNodeAttrValue = subv.second.get_value<type>();
  289. l_mapChildNodeAttrs.insert(pair<tstring, type>(l_strChildNodeAttr, l_tpChildNodeAttrValue));
  290. }
  291. o_mmapChildNodesAttrs.insert(pair<tstring, map<tstring, type>>(l_strChildNode, l_mapChildNodeAttrs));
  292. }
  293. return true;
  294. }
  295. catch (const std::exception &e)
  296. {
  297. cout << "Error:" << typeid(e).name() << ": ";
  298. cout << e.what() << endl;
  299. return false; //error: exception
  300. }
  301.  
  302. return false;
  303. }
  304.  
  305. //提供指向指定节点的可读写迭代器io_iter,使用i_strNodeValue修改指定节点的值
  306. bool SetCurrentNodeValue(tptree::iterator io_iter, const tstring i_strNodeValue)
  307. {
  308. try
  309. {
  310. io_iter->second.put_value<tstring>(i_strNodeValue);
  311. return true;
  312. }
  313. catch (const std::exception &e)
  314. {
  315. cout << "Error:" << typeid(e).name() << ": ";
  316. cout << e.what() << endl;
  317. return false; //error: exception
  318. }
  319.  
  320. return false;
  321. }
  322.  
  323. //提供指向指定节点属性的可读写迭代器io_iter,使用i_strNodeAttrValue修改指定节点的值
  324. bool SetCurrentNodeAttrValue(tptree::iterator io_iter, const tstring i_strNodeAttrValue)
  325. {
  326. try
  327. {
  328. io_iter->second.put_value<tstring>(i_strNodeAttrValue);
  329. return true;
  330. }
  331. catch (const std::exception &e)
  332. {
  333. cout << "Error:" << typeid(e).name() << ": ";
  334. cout << e.what() << endl;
  335. return false; //error: exception
  336. }
  337.  
  338. return false;
  339. }
  340.  
  341. //提供指向指定节点的迭代器io_iter,将该节点删除
  342. //节点io_pt就是迭代器io_iter指定的节点本身
  343. //注:也可以删除节点属性,删除属性请使用<xmlattr>
  344. bool DelCurrentNode(tptree &io_pt, tptree::iterator i_iter)
  345. {
  346. try
  347. {
  348. io_pt.erase(i_iter);
  349. return true;
  350. }
  351. catch (const std::exception &e)
  352. {
  353. cout << "Error:" << typeid(e).name() << ": ";
  354. cout << e.what() << endl;
  355. return false; //error: exception
  356. }
  357.  
  358. return false;
  359. }
  360.  
  361. //当前节点io_pt
  362. //将该节点以及所有具有相同节点名字节点删除
  363. //注:也可以删除节点属性,删除属性请使用<xmlattr>
  364. tptree::size_type DelCurrentNodes(tptree &io_pt, const tstring &i_strChildNode)
  365. {
  366. try
  367. {
  368. return io_pt.erase(i_strChildNode);
  369. }
  370. catch (const std::exception &e)
  371. {
  372. cout << "Error:" << typeid(e).name() << ": ";
  373. cout << e.what() << endl;
  374. return -; //error: exception
  375. }
  376.  
  377. return -;
  378. }
  379.  
  380. void main()
  381. {
  382. //test code
  383. string l_strFileName1("F:\\Desktop\\20140411\\测试\\testxml.xml");
  384. string l_strFileName2("F:\\Desktop\\20140411\\测试\\testxml2.xml");
  385. tptree pt;
  386. bool f = LoadXML(pt, l_strFileName1);
  387.  
  388. //测试IsExistChildNode函数
  389. //tstring l_strNodePath(_USERT("config.departments.department.info.person.<xmlattr>.id"));
  390. //int l_nState1 = IsExistChildNode(pt, l_strNodePath);
  391.  
  392. //测试IsExistChildNode函数
  393. //tstring l_strNodePath(_USERT("config.departments.department.info.person")); //有直接子节点或者属性
  394. //int l_nState2 = IsExistChildNode(pt, l_strNodePath);
  395.  
  396. //测试IsChildNodeOrAttr函数
  397. //tstring l_strNodePath(_USERT("config.departments.department.info"));
  398. //bool l_bChildNodeOrAttribute;
  399. //int l_nChildNodeCount;
  400. //int l_nChildNodeAttributeCount;
  401. //bool f3 = IsChildNodeOrAttr(pt, l_strNodePath, l_bChildNodeOrAttribute, l_nChildNodeCount, l_nChildNodeAttributeCount);
  402.  
  403. //测试IsChildNodeOrAttr函数
  404. //tstring l_strNodePath(_USERT("config.departments.department.info.person"));
  405. //bool l_bChildNodeOrAttribute;
  406. //int l_nChildNodeCount;
  407. //int l_nChildNodeAttributeCount;
  408. //bool f3 = IsChildNodeOrAttr(pt, l_strNodePath, l_bChildNodeOrAttribute, l_nChildNodeCount, l_nChildNodeAttributeCount);
  409.  
  410. //测试GetChildNodes函数
  411. //tstring l_strNodePath(_USERT("config.departments.department.info"));
  412. //bool l_bChildNodeOrAttribute;
  413. //int l_nChildNodeCount;
  414. //int l_nChildNodeAttributeCount;
  415. //bool f4 = IsChildNodeOrAttr(pt, l_strNodePath, l_bChildNodeOrAttribute, l_nChildNodeCount, l_nChildNodeAttributeCount);
  416. //bool f5;
  417. //multimap<tstring, tstring> l_mapChildNodes;
  418. //if (l_bChildNodeOrAttribute)
  419. //{
  420. // f5 = GetChildNodes<tstring>(pt, l_strNodePath, l_mapChildNodes);
  421. //}
  422.  
  423. //测试GetChildNodes函数
  424. //typ==int error
  425. //tstring l_strNodePath(_USERT("config.departments.department.info"));
  426. //bool l_bChildNodeOrAttribute;
  427. //int l_nChildNodeCount;
  428. //int l_nChildNodeAttributeCount;
  429. //bool f4 = IsChildNodeOrAttr(pt, l_strNodePath, l_bChildNodeOrAttribute, l_nChildNodeCount, l_nChildNodeAttributeCount);
  430. //bool f5;
  431. //multimap<tstring, int> l_mapChildNodes;
  432. //if (l_bChildNodeOrAttribute)
  433. //{
  434. // f5 = GetChildNodes<int>(pt, l_strNodePath, l_mapChildNodes);
  435. //}
  436.  
  437. //测试GetChildNodes函数
  438. //tstring l_strNodePath(_USERT("config.departments.department"));
  439. //bool l_bChildNodeOrAttribute;
  440. //int l_nChildNodeCount;
  441. //int l_nChildNodeAttributeCount;
  442. //bool f4 = IsChildNodeOrAttr(pt, l_strNodePath, l_bChildNodeOrAttribute, l_nChildNodeCount, l_nChildNodeAttributeCount);
  443. //bool f5;
  444. //multimap<tstring, tstring> l_mapChildNodes;
  445. //if (l_bChildNodeOrAttribute)
  446. //{
  447. // f5 = GetChildNodes<tstring>(pt, l_strNodePath, l_mapChildNodes);
  448. //}
  449.  
  450. //测试GetCurrentNodeAttrs函数
  451. //tstring l_strNodePath(_USERT("config.departments.department.info.person"));
  452. //multimap<tstring, tstring> l_mapChildNodes;
  453. //bool f5 = GetChildNodes<tstring>(pt, l_strNodePath, l_mapChildNodes);
  454.  
  455. //测试GetCurrentNodeAttrs函数
  456. //tstring l_strNodePath(_USERT("config.departments.department.info.person"));
  457. //bool l_bChildNodeOrAttribute;
  458. //int l_nChildNodeCount;
  459. //int l_nChildNodeAttributeCount;
  460. //bool f4 = IsChildNodeOrAttr(pt, l_strNodePath, l_bChildNodeOrAttribute, l_nChildNodeCount, l_nChildNodeAttributeCount);
  461. //bool f5;
  462. //map<tstring, tstring> l_mapChildNodeAttrs;
  463. //if (!l_bChildNodeOrAttribute)
  464. //{
  465. // f5 = GetCurrentNodeAttrs<tstring>(pt, l_strNodePath, l_mapChildNodeAttrs);
  466. //}
  467.  
  468. //测试GetChildNodesAttrs函数
  469. //tstring l_strNodePath(_USERT("config.departments.department.info"));
  470. //bool f5;
  471. ////map<tstring, tstring> l_mapChildNodeAttrs;
  472. //multimap<tstring, map<tstring, tstring>> l_mmapChildNodesAttrs;
  473. //f5 = GetChildNodesAttrs<tstring>(pt, l_strNodePath, l_mmapChildNodesAttrs);
  474.  
  475. //测试SetCurrentNodeValue函数
  476. //tstring l_strNodePath(_USERT("config.departments.department.info"));
  477. //tptree::iterator iter= pt.get_child(l_strNodePath).begin();
  478. //tstring l_strNodeValue = _USERT("testvalue");
  479. //bool f6 = SetCurrentNodeValue(iter, l_strNodeValue);
  480.  
  481. //测试SetCurrentNodeAttrValue函数
  482. //tstring l_strNodePath(_USERT("config.departments.department.info.person.<xmlattr>"));
  483. //tptree::iterator iter= pt.get_child(l_strNodePath).begin();
  484. //tstring l_strNodeValue = _USERT("testvalue");
  485. //bool f6 = SetCurrentNodeAttrValue(iter, l_strNodeValue);
  486.  
  487. //测试DelCurrentNode函数
  488. //tstring l_strNodePath(_USERT("config.departments.department.info"));
  489. //tptree &childpt = pt.get_child(l_strNodePath);
  490. //tptree::iterator iter = childpt.begin();
  491. //bool f6 = DelCurrentNode(childpt, ++iter);
  492.  
  493. //测试DelCurrentNode函数
  494. //tstring l_strNodePath(_USERT("config.departments.department.info.person.<xmlattr>"));
  495. //tptree &childpt = pt.get_child(l_strNodePath);
  496. //tptree::iterator iter = childpt.begin();
  497. //bool f6 = DelCurrentNode(childpt, ++iter);
  498.  
  499. //测试DelCurrentNodes函数
  500. //tstring l_strNodePath(_USERT("config.departments.department.info"));
  501. //tptree &childpt = pt.get_child(l_strNodePath);
  502. //tptree::key_type kt = childpt.begin()->first;
  503. //tptree::size_type st6 = DelCurrentNodes(childpt, kt);
  504.  
  505. //测试DelCurrentNodes函数
  506. //tstring l_strNodePath(_USERT("config.departments.department.info.person.<xmlattr>"));
  507. //tptree &childpt = pt.get_child(l_strNodePath);
  508. //tptree::key_type kt = childpt.begin()->first;
  509. //tptree::size_type st6 = DelCurrentNodes(childpt, kt);
  510.  
  511. //bool f2 = SaveXML(pt, l_strFileName2);
  512.  
  513. cout << endl;
  514. }

testxml.xml测试文件:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <config>
  3. <mainformsize height="600" width="330" top="50" left="500"/>
  4. <applicationtitle>GoCom统一通讯应用平台</applicationtitle>
  5. <loginmark>
  6. <fontsize>14</fontsize>
  7. <fontcolor>$0000ff</fontcolor>
  8. <lantern>true</lantern>
  9. <clientversion>5.3.5.17</clientversion>
  10. <serverip>imbs1.smartdot.com.cn</serverip>
  11. </loginmark>
  12. <departments>
  13. <department>
  14. <name>donghe</name>
  15. <level>2</level>
  16. <personcount>3</personcount>
  17. <info>
  18. <person id="1_1_1" name="王慧敏"/>
  19. <person id="1_1_2" name="刘东升"/>
  20. <person id="1_1_3" name="张智卓"/>
  21. </info>
  22. </department>
  23. <department>
  24. <name>boyun</name>
  25. <level>2</level>
  26. <personcount>3</personcount>
  27. <info>
  28. <person id="1_2_1" name="朗朗"/>
  29. <person id="1_2_2" name="隋国龙"/>
  30. </info>
  31. </department>
  32. </departments>
  33. </config>

注:代码可以正常运行在VS2010环境下,先下载安装boost库并添加到项目中,代码才能正常运行。​

boost::xml——基本操作以及中文乱码解决方案的更多相关文章

  1. boost::xml——基本操作以及中文乱码解决方案 (续)

    本博文主要想说明以下两点: 1.对于上一篇的<boost::xml——基本操作以及中文乱码解决方案>解释,这篇博文基本解决了正确输入输出中英文问题,但是好像还没有解决修改中文出现乱码的问题 ...

  2. JSP中pageEncoding和charset区别,中文乱码解决方案(转载)

    转载自:JSP中pageEncoding和charset区别,中文乱码解决方案 JSP指令标签中<%@ page contentType="text/html;charset=GB23 ...

  3. Java中文乱码解决方案

    Java中文乱码解决方案   1.中文乱码解决方案,确保每个文件的默认编码是UTF-8         加入 URIEncoding="UTF-8" 代码中的设置 1>在se ...

  4. (转)JSP HTML JAVASCRIPT 中文乱码 解决方案 大全

    JSP HTML JAVASCRIPT 中文乱码 解决方案 大全 JSP的中文字符一直是各位初学者首先要解决的问题,下面进行了总结,也给出了解决办法.C4.1 HTML中文编码转换 在JSP文件中的静 ...

  5. AJAX中文乱码解决方案

    通过AJAX获取数据中文乱码解决方案: @ResponseBody 作用: 该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到 ...

  6. aspx页面,中文乱码解决方案

    由于文件编码方式编码方式不统一出现样式中文乱码解决方案: 今天碰到的问题:页面字体样式设置的'微软雅黑',可页面没引用.我调试看到样式出现中文乱码了 这种问题,就需要转换文件的编码方式,如下两步即可解 ...

  7. 基于Windows环境下cmd/编译器无法输入中文,显示中文乱码解决方案

    基于Windows环境下cmd/编译器无法输入中文,显示中文乱码解决方案 两个月前做C++课设的时候,电脑编译器编译结果出现了中文乱码,寻求了百度和大神们,都没有解决这个问题,百度上一堆解释是对编译器 ...

  8. JS传值中文乱码解决方案

    JS传值中文乱码解决方案 一.相关知识 1,Java相关类: (1)java.net.URLDecoder类 HTML格式解码的实用工具类,有一个静态方法:public static  String ...

  9. Eclipse中文乱码解决方案

    Eclipse中文乱码解决方案 1)第一个设置:window>perferences>general>workspace>text file encoding 2)Jsp编码问 ...

随机推荐

  1. C++ ADO 数据查询

    ADO 数据查询 关键点 上1条 下1条 第1条 最后1条 实现过程 // stdafx.h : include file for standard system include files, #im ...

  2. Qt4.8.6+mingw+Qgis2.4.0基于QGis的二次开发

    关于QGis的二次开发,大致看了一下,基本都是在VC+QT的环境下做环境部署,并且QGis的版本号很老.在mingw下直接开发搭建好开发环境的样例少之又少.基于最新的Qgis2.4.0版本号做了对应的 ...

  3. PHP泛域名应用

    以Windows开发环境 1.windows =>hosts文件 127.0.0.1    asia.t127.0.0.1    *.asia.t127.0.0.1    www.asia.t1 ...

  4. inux2.6.xx内核代码分析( 72节)

    http://blog.csdn.net/ustc_dylan/article/category/469214

  5. C++中创建对象的时候加括号和不加括号的区别

    c++创建对象的语法有----- 1 在栈上创建 MyClass a; 2 在堆上创建加括号 MyClass *a= new MyClass(); 3 不加括号 MyClass *a = new My ...

  6. MySQL中的WITH ROLLUP

    MySQL中的WITH ROLLUP MySQL的扩展SQL中有一个非常有意思的应用WITH ROLLUP,在分组的统计数据的基础上再进行相同的统计(SUM,AVG,COUNT…),非常类似于Orac ...

  7. redis终于有比较大的进展了,redis3.0.1 稳定版本发布,支持集群。

    原文地址:https://raw.githubusercontent.com/antirez/redis/3.0/00-RELEASENOTES Redis 3.0 release notes --[ ...

  8. css笔记12:块元素和行内元素

    1.概念: 行内元素:又叫内联元素,内联元素只能容纳文本或者其他内联元素,常见的内联元素有<span><a> 块元素:块元素一般都是从新行开始,可容纳文本,其他内联元素和其他块 ...

  9. Android(java)学习笔记116:PC_Phone通信程序报错

    1.首先我写的程序代码如下: package com.himi.udpsend; import java.net.DatagramPacket; import java.net.DatagramSoc ...

  10. Python Thread

    lock 对象: acquire():负责取得一个锁.如果没有线程正持有锁,acquire方法会立刻得到锁.否则,它闲意态等锁被释放. 一旦acquire()返回,调用它的线程就持有锁. releas ...