前言
創(chuàng)新互聯(lián)公司主要從事網(wǎng)頁設(shè)計、PC網(wǎng)站建設(shè)(電腦版網(wǎng)站建設(shè))、wap網(wǎng)站建設(shè)(手機版網(wǎng)站建設(shè))、自適應(yīng)網(wǎng)站建設(shè)、程序開發(fā)、網(wǎng)站優(yōu)化、微網(wǎng)站、小程序設(shè)計等,憑借多年來在互聯(lián)網(wǎng)的打拼,我們在互聯(lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)積累了豐富的網(wǎng)站制作、成都網(wǎng)站設(shè)計、網(wǎng)站設(shè)計、網(wǎng)絡(luò)營銷經(jīng)驗,集策劃、開發(fā)、設(shè)計、營銷、管理等多方位專業(yè)化運作于一體。
Libxml2 是一個xml c語言版的解析器,本來是為Gnome項目開發(fā)的工具,是一個基于MIT License的免費開源軟件。它除了支持c語言版以外,還支持c++、PHP、Pascal、Ruby、Tcl等語言的綁定,能在Windows、Linux、Solaris、MacOsX等平臺上運行。功能還是相當(dāng)強大的,相信滿足一般用戶需求沒有任何問題。
libxml2常用數(shù)據(jù)類型
xmlChar是libxml2中的字符類型,在庫中的所有字符,字符串都是基于這個數(shù)據(jù)類型的。
xmlChar*是指針類型,很多函數(shù)都會返回一個動態(tài)分配的內(nèi)存的xmlChar*類型的變量,因此,在使用這類函數(shù)時要記得釋放內(nèi)存,否則會導(dǎo)致內(nèi)存泄漏,例如這樣的用法:
xmlChar *name = xmlNodeGetContent(CurNode); strcpy(data.name, name); xmlFree(name);
場景
1.libxml2基本上算是xml的C/C++標準讀寫庫. 在linux,macOS里是默認支持. 可惜在Windows上有自己專有的msxml, 所以并不支持libxml2, 惡心的是msxml還不是標配, 還要必須另外下載安裝, 所以作為Windows上優(yōu)先選擇的XML庫, 就是可跨平臺的libxml2.
2.xml的sax讀取庫expat也是比較優(yōu)秀的選擇, 可惜不支持寫.
3.一般的寫庫方式是生成一整個DOM結(jié)構(gòu), 之后把這個DOM結(jié)構(gòu)輸出到XML格式的文本里, 可調(diào)用自帶寫函數(shù)或標準io函數(shù). 這樣的缺點是如果生成這個DOM結(jié)構(gòu)過于大, 會導(dǎo)致在生成這個DOM結(jié)構(gòu)時內(nèi)存暴漲,之后再輸出到內(nèi)存里,這時候內(nèi)存又暴漲一次,最后從內(nèi)存輸出到文件里.
說明
1.DOM結(jié)構(gòu)存儲非常浪費內(nèi)存, 如果數(shù)據(jù)量大時, 但是元素的父子關(guān)系, 文本值,屬性值等等很浪費內(nèi)存. 如果我們可以按照每個元素來輸出的話,最好輸出完就釋放元素內(nèi)存, 那么能最大限度的利用內(nèi)存資源.
2.局部輸出元素可以最大限度使用系統(tǒng)的資源, 比如IO輸出需要權(quán)限限制的函數(shù), 或者輸出到界面等
例子
以下例子是windows上使用libxml2, 用mingw編譯出的libxml2, 使用_wfopen來打開unicode編碼的文件路徑.
#include "stdafx.h" #include#include #include #include #include void TestStandardIOForXml() { xmlDocPtr doc = NULL; /* document pointer */ xmlNodePtr one_node = NULL, node = NULL, node1 = NULL;/* node pointers */ char buff[256]; int i, j; doc = xmlNewDoc(BAD_CAST "1.0"); std::shared_ptr sp_doc(doc,[](void* doc1){ xmlDocPtr doc = (xmlDocPtr)doc1; xmlFreeDoc(doc); }); FILE* file = _wfopen(L"test.xml",L"wb"); if(!file) return; std::shared_ptr sp_file(file,[](FILE* file){ fclose(file); }); // 寫XML的聲明 xmlChar* doc_buf = NULL; int size = 0; xmlDocDumpMemoryEnc(doc,&doc_buf,&size,"UTF-8"); std::shared_ptr sp_xc(doc_buf,[](xmlChar* doc_buf){ xmlFree(doc_buf); }); fwrite(doc_buf,strlen((const char*)doc_buf),1,file); xmlBufferPtr buf = xmlBufferCreate(); std::shared_ptr sp_buf(buf,[](void* buf1){ xmlBufferPtr buf = (xmlBufferPtr)buf1; xmlBufferFree(buf); }); const char* kRootBegin = " "; fwrite(kRootBegin,strlen(kRootBegin),1,file); for(int i = 0; i< 10; ++i){ one_node = xmlNewNode(NULL, BAD_CAST "one"); xmlNewChild(one_node, NULL, BAD_CAST "node1", BAD_CAST "content of node 1"); xmlNewChild(one_node, NULL, BAD_CAST "node2", NULL); node = xmlNewChild(one_node, NULL, BAD_CAST "node3",BAD_CAST "this node has attributes"); xmlNewProp(node, BAD_CAST "attribute", BAD_CAST "yes"); xmlNewProp(node, BAD_CAST "foo", BAD_CAST "bar"); node = xmlNewNode(NULL, BAD_CAST "node4"); node1 = xmlNewText(BAD_CAST "other way to create content (which is also a node)"); xmlAddChild(node, node1); xmlAddChild(one_node, node); xmlNodeDump(buf,doc,one_node,1,1); fwrite(buf->content,buf->use,1,file); xmlUnlinkNode(one_node); xmlFreeNode(one_node); xmlBufferEmpty(buf); } const char* kRootEnd = " "; fwrite(kRootEnd,strlen(kRootEnd),1,file); }
輸出文件:
<?xml version="1.0" encoding="UTF-8"?>contentÖÐÎÄ of node 1 this node has attributes other way to create content (which is also a node) content of node 1 this node has attributes other way to create content (which is also a node) content of node 1 this node has attributes other way to create content (which is also a node) content of node 1 this node has attributes other way to create content (which is also a node) content of node 1 this node has attributes other way to create content (which is also a node) content of node 1 this node has attributes other way to create content (which is also a node) content of node 1 this node has attributes other way to create content (which is also a node) content of node 1 this node has attributes other way to create content (which is also a node) content of node 1 this node has attributes other way to create content (which is also a node) content of node 1 this node has attributes other way to create content (which is also a node)
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對創(chuàng)新互聯(lián)的支持。