日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

rapidxml库生成xml小例子及需注意的问题

發(fā)布時(shí)間:2024/8/1 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 rapidxml库生成xml小例子及需注意的问题 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

結(jié)論:rapidxml和pugixml在生成xml方面,我建議使用pugixml,優(yōu)點(diǎn)很多,不用關(guān)心string的生命周期,像函數(shù)一樣使用添加節(jié)點(diǎn),屬性,很方便;而且效率高,個(gè)人測(cè)試了下:生成300個(gè)xml文件,pugixml用時(shí)6s,rapidxml用時(shí)60+s,效率差了10倍

如果你工作必須使用rapidxml或者換起來(lái)麻煩,那么繼續(xù)往下看,有關(guān)寫xml需要注意的一些問(wèn)題

rapidxml 下載:

在官網(wǎng)上下載即可,
http://rapidxml.sourceforge.net/
https://sourceforge.net/projects/rapidxml/

得到的壓縮包里有文件如下:

讀取或者解析xml,這篇大佬寫的比較全面:
https://blog.csdn.net/v_xchen_v/article/details/75634273

這里補(bǔ)充下生成xml方面需要注意的問(wèn)題:

1. 字符串的生命周期問(wèn)題:每次添加節(jié)點(diǎn),string需要使用rapidxml的內(nèi)存申請(qǐng)函數(shù)

如果給節(jié)點(diǎn)賦值的是一個(gè)局部變量string或者char*,如果局部變量的生命周期,那么節(jié)點(diǎn)的值就會(huì)為空,建議使用rapidxml自帶的allocate_string方法來(lái)申請(qǐng)字符串內(nèi)存,這樣它的生命周期和節(jié)點(diǎn)的值必然是一致的了;

2. 節(jié)點(diǎn)包含中文的情況(這部分個(gè)人理解,如有不對(duì),懇請(qǐng)斧正)

先說(shuō)我們要寫的xml文件如下:

<book PageNumber="10"><name>小王子</name> </book>

一般寫的話,還有<?xml version="1.0" encoding="utf-8"?>,這是我們常見(jiàn)的,同樣有 <?xml version="1.0" encoding="gbk"?>等,編碼格式聲明;
使用rapidxml,寫入字符串,有char *和wchar_t *的區(qū)別,默認(rèn)是char *

// char * 方式rapidxml::xml_node<>* rot = xml_doc.allocate_node(rapidxml::node_pi, xml_doc.allocate_string("xml version='1.0' encoding='gbk'"));// wchar_t * 方式rapidxml::xml_node<wchar_t>* rot = xml_doc.allocate_node(rapidxml::node_pi, xml_doc.allocate_string(L"xml version='1.0' encoding='utf-8'"));

如果你用的是char*,然后節(jié)點(diǎn)包含中文,這時(shí)候聲明為:<?xml version="1.0" encoding="utf-8"?>,那么生成的xml文件在瀏覽器里會(huì)報(bào)錯(cuò),如下所示:

所以這里建議:如果你用的是char*,然后節(jié)點(diǎn)包含中文,使用<?xml version="1.0" encoding="gbk"?>這個(gè)聲明;
當(dāng)然最好的,是用wchar_t *,節(jié)點(diǎn)包含中文,就可以使用<?xml version="1.0" encoding="utf-8"?>聲明,不用擔(dān)心編碼解析問(wèn)題

3. 節(jié)點(diǎn)寫入int,float等類型的值

int, float,bool需要轉(zhuǎn)換成char*字符串再寫入節(jié)點(diǎn),這里覺(jué)得使用不方便,不過(guò)還是提供下轉(zhuǎn)換的函數(shù)如下,具體見(jiàn)下面代碼里的Convert函數(shù)

char *方式創(chuàng)建一個(gè)包含中文格式的xml文件

#include <iostream> #include <sstream>#include "rapidxml.hpp" #include "rapidxml_utils.hpp" #include "rapidxml_print.hpp"// int , float, double等類型 轉(zhuǎn)為 std::string // bool 類型會(huì)解析成 false:0, true :1 template <typename T> std::string Convert(const T value) {using namespace std;ostringstream oss;oss << value;string str(oss.str());return str; }int main(int argc, char const *argv[]) {rapidxml::xml_document<> xml_doc;//生成 <?xml version="1.0" encoding="utf-8"?>//創(chuàng)建指向上述節(jié)點(diǎn)位置的節(jié)點(diǎn)對(duì)象rapidxml::xml_node<>* rot = xml_doc.allocate_node(rapidxml::node_pi, xml_doc.allocate_string("xml version='1.0' encoding='gbk'"));xml_doc.append_node(rot);rapidxml::xml_node<>* root_node = xml_doc.allocate_node(rapidxml::node_element, xml_doc.allocate_string("book"));// 寫入int, float等值需要先轉(zhuǎn)成string類型再寫入int count = 10;char *pageNum_str = xml_doc.allocate_string(Convert(count).c_str());rapidxml::xml_attribute<>* attr_pageNum = xml_doc.allocate_attribute(xml_doc.allocate_string("PageNumber"), pageNum_str);root_node->append_attribute(attr_pageNum);rapidxml::xml_node<>* name_node = xml_doc.allocate_node(rapidxml::node_element, xml_doc.allocate_string("name"), xml_doc.allocate_string("小王子"));root_node->append_node(name_node);xml_doc.append_node(root_node);// 先得到std::string sOut;rapidxml::print(std::back_inserter(sOut), xml_doc, 0);std::cout << sOut << std::endl;// 保存xml文件 std::string file_name("rapidxml_example.xml");// C++ 流式寫入文件std::ofstream pagefile(file_name);pagefile << sOut;pagefile.close();return 0; }

wchar_t方式創(chuàng)建一個(gè)包含中文格式的xml文件

#include <iostream> #include <sstream>#include "rapidxml.hpp" #include "rapidxml_utils.hpp" #include "rapidxml_print.hpp"template <typename T> std::wstring Convert(const T Num) {using namespace std;wostringstream oss;oss << Num;wstring str(oss.str());return str; }// std::wstring 轉(zhuǎn) std::string std::string ws2s(const std::wstring &ws) {size_t i;std::string curLocale = setlocale(LC_ALL, NULL);setlocale(LC_ALL, "chs");const wchar_t* _source = ws.c_str();size_t _dsize = 2 * ws.size() + 1;std::unique_ptr< char[] > buff(new char[_dsize]);memset(buff.get(), 0x0, _dsize);wcstombs_s(&i, buff.get(), _dsize, _source, _dsize);std::string result = buff.get();setlocale(LC_ALL, curLocale.c_str());return result; }// std::string 轉(zhuǎn) std::wstring std::wstring s2ws(const std::string &s) {size_t i;std::string curLocale = setlocale(LC_ALL, NULL);setlocale(LC_ALL, "chs");const char* _source = s.c_str();size_t _dsize = s.size() + 1;std::unique_ptr< wchar_t[] > buff(new wchar_t[_dsize]);wmemset(buff.get(), 0x0, _dsize);mbstowcs_s(&i, buff.get(), _dsize, _source, _dsize);std::wstring result = buff.get();setlocale(LC_ALL, curLocale.c_str());return result; }// using namespace std; int main(int argc, char const *argv[]) {rapidxml::xml_document<wchar_t> xml_doc;//生成 <?xml version="1.0" encoding="utf-8"?>//創(chuàng)建指向上述節(jié)點(diǎn)位置的節(jié)點(diǎn)對(duì)象rapidxml::xml_node<wchar_t>* rot = xml_doc.allocate_node(rapidxml::node_pi, xml_doc.allocate_string(L"xml version='1.0' encoding='utf-8'"));xml_doc.append_node(rot);rapidxml::xml_node<wchar_t>* root_node = xml_doc.allocate_node(rapidxml::node_element, xml_doc.allocate_string(L"book"));// 寫入int, float等值需要先轉(zhuǎn)成string類型再寫入int count = 10;wchar_t *pageNum_str = xml_doc.allocate_string(Convert(count).c_str());rapidxml::xml_attribute<wchar_t>* attr_pageNum = xml_doc.allocate_attribute(xml_doc.allocate_string(L"PageNumber"), pageNum_str);root_node->append_attribute(attr_pageNum);rapidxml::xml_node<wchar_t>* name_node = xml_doc.allocate_node(rapidxml::node_element, xml_doc.allocate_string(L"name"), xml_doc.allocate_string(L"小王子"));root_node->append_node(name_node);xml_doc.append_node(root_node);// 先得到std::wstring sOut;rapidxml::print(std::back_inserter(sOut), xml_doc, 0);std::wcout.imbue(std::locale("chs"));std::wcout << sOut << std::endl;// 保存xml文件 std::string file_name("rapidxml_wchar_example.xml");// C 庫(kù)函數(shù)寫入文件,可以確保文件編碼為utf-8std::wstring wfilename = s2ws(file_name);FILE * fp = _wfsopen(wfilename.c_str(), L"a+,ccs=UTF-8", _SH_DENYNO);if (fp == NULL){printf("err\n");}int num = fwprintf_s(fp, L"%s", sOut.c_str());fclose(fp);return 0; }

總結(jié)

以上是生活随笔為你收集整理的rapidxml库生成xml小例子及需注意的问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 色视频导航 | 91丝袜一区在线观看 | 最新福利在线 | 国产一区二区三区 | 一区二区三区免费看视频 | 玩偶姐姐在线看 | 国产精选av| 国产三级漂亮女教师 | 少妇福利视频 | 18做爰免费视频网站 | 国产丝袜精品视频 | 国产成人综合在线视频 | 国产精品日本一区二区在线播放 | 日韩精品一区在线视频 | 亚洲欧洲综合在线 | 精品久久人妻av中文字幕 | 视频1区2区 | 欧美大黄 | 亚洲桃色av | 麻豆av网| 久久久黄色| 男人久久天堂 | 成人免费黄色大片v266 | jzzijzzij亚洲成熟少妇在线播放 狠狠躁日日躁夜夜躁2022麻豆 | 日本在线中文字幕专区 | 成人av影视在线 | 国产网红女主播精品视频 | 狠狠搞视频 | 性感美女一区 | 亚洲一区 中文字幕 | 色多多在线看 | 色男天堂 | 日韩一级二级视频 | 农村少妇无套内谢粗又长 | 精品成在人线av无码免费看 | xxx一区 | 成人依依| 狠狠鲁影院 | 欧美第十页 | 成人精品一区二区三区电影 | 欧美在线精品一区二区三区 | 亚洲欧美日韩精品色xxx | 毛片手机在线 | 欧美视频在线观看一区 | 欧美激情一区二区 | 欧美极品jizzhd欧美仙踪林 | 成人精品免费视频 | 亚洲在线一区二区三区 | 国产高清不卡一区 | 永久免费精品影视网站 | 成人手机在线免费视频 | 国产伦理片在线观看 | 九九九免费视频 | 欧美精品免费在线观看 | 亚洲人人夜夜澡人人爽 | www.伊人网| 激情综合影院 | 99ri在线观看 | 黄色在线免费网站 | 熊出没之冬日乐翻天免费高清观看 | av在线综合网 | 樱桃视频污污 | 99re这里只有 | 精品国产免费视频 | 午夜毛片在线 | 国产精品夫妻 | 少妇超碰| 国产日日夜夜 | 亚洲伦理自拍 | 国产成人毛片 | aⅴ在线免费观看 | a黄视频 | 国产亚洲精品码 | 美女一区二区三区 | 久久久久久久精 | 亚洲精品成人久久 | 先锋影音制服丝袜 | 男生坤坤放进女生坤坤里 | 国产男女av | 欧美 日韩 国产 成人 | 好看的中文字幕电影 | 大地资源二中文在线影视观看 | 综合精品在线 | 国产精品久久久久久久一区二区 | 色偷av| 一本色道久久88综合日韩精品 | 五月香蕉网 | 美味的客房沙龙服务 | 中文字幕亚洲不卡 | 国产精品 欧美 日韩 | 小向美奈子在线观看 | 久久性色av| 欧美日韩一区精品 | 亚洲精品粉嫩小泬 | 在线免费av网站 | 亚洲精品乱码久久久久久蜜桃图片 | 欧美高清a| 国产91区 | 国产精品18久久久久久vr下载 |