C/C++利用libxml2高效輸出XML大文件詳解

前言

創新互聯公司主要從事網頁設計、PC網站建設(電腦版網站建設)、wap網站建設(手機版網站建設)、自適應網站建設、程序開發、網站優化、微網站、小程序設計等,憑借多年來在互聯網的打拼,我們在互聯網網站建設行業積累了豐富的網站制作、成都網站設計、網站設計、網絡營銷經驗,集策劃、開發、設計、營銷、管理等多方位專業化運作于一體。

Libxml2 是一個xml c語言版的解析器,本來是為Gnome項目開發的工具,是一個基于MIT License的免費開源軟件。它除了支持c語言版以外,還支持c++、PHP、Pascal、Ruby、Tcl等語言的綁定,能在Windows、Linux、Solaris、MacOsX等平臺上運行。功能還是相當強大的,相信滿足一般用戶需求沒有任何問題。

libxml2常用數據類型

xmlChar是libxml2中的字符類型,在庫中的所有字符,字符串都是基于這個數據類型的。

xmlChar*是指針類型,很多函數都會返回一個動態分配的內存的xmlChar*類型的變量,因此,在使用這類函數時要記得釋放內存,否則會導致內存泄漏,例如這樣的用法:

xmlChar *name = xmlNodeGetContent(CurNode);
strcpy(data.name, name);
xmlFree(name);
  • xmlDoc、 xmlDocPtr //文檔對象結構體及指針
  • xmlNode、 xmlNodePtr //節點對象結構體及節點指針
  • xmlAttr、 xmlAttrPtr //節點屬性的結構體及其指針
  • xmlNs、 xmlNsPtr //節點命名空間的結構及指針
  • BAD_CAST //一個宏定義,事實上它即是xmlChar*類型

場景

1.libxml2基本上算是xml的C/C++標準讀寫庫. 在linux,macOS里是默認支持. 可惜在Windows上有自己專有的msxml, 所以并不支持libxml2, 惡心的是msxml還不是標配, 還要必須另外下載安裝, 所以作為Windows上優先選擇的XML庫, 就是可跨平臺的libxml2.

2.xml的sax讀取庫expat也是比較優秀的選擇, 可惜不支持寫.

3.一般的寫庫方式是生成一整個DOM結構, 之后把這個DOM結構輸出到XML格式的文本里, 可調用自帶寫函數或標準io函數. 這樣的缺點是如果生成這個DOM結構過于大, 會導致在生成這個DOM結構時內存暴漲,之后再輸出到內存里,這時候內存又暴漲一次,最后從內存輸出到文件里.

說明

1.DOM結構存儲非常浪費內存, 如果數據量大時, 但是元素的父子關系, 文本值,屬性值等等很浪費內存. 如果我們可以按照每個元素來輸出的話,最好輸出完就釋放元素內存, 那么能最大限度的利用內存資源.

2.局部輸出元素可以最大限度使用系統的資源, 比如IO輸出需要權限限制的函數, 或者輸出到界面等

例子

以下例子是windows上使用libxml2, 用mingw編譯出的libxml2, 使用_wfopen來打開unicode編碼的文件路徑.

#include "stdafx.h"
#include <libxml/parser.h>
#include <libxml/tree.h>
#include <libxml/xmlreader.h>
#include <iostream>
#include <memory>

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<void> 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<FILE> 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<xmlChar> 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<void> sp_buf(buf,[](void* buf1){
 xmlBufferPtr buf = (xmlBufferPtr)buf1;
 xmlBufferFree(buf);
 });

 const char* kRootBegin = "<ROOT>";
 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 = "</ROOT>";
 fwrite(kRootEnd,strlen(kRootEnd),1,file);

}

輸出文件:

<?xml version="1.0" encoding="UTF-8"?>
<ROOT><one>
 <node1>contentÖÐÎÄ of node 1</node1>
 <node2/>
 <node3 attribute="yes" foo="bar">this node has attributes</node3>
 <node4>other way to create content (which is also a node)</node4>
 </one><one>
 <node1>content of node 1</node1>
 <node2/>
 <node3 attribute="yes" foo="bar">this node has attributes</node3>
 <node4>other way to create content (which is also a node)</node4>
 </one><one>
 <node1>content of node 1</node1>
 <node2/>
 <node3 attribute="yes" foo="bar">this node has attributes</node3>
 <node4>other way to create content (which is also a node)</node4>
 </one><one>
 <node1>content of node 1</node1>
 <node2/>
 <node3 attribute="yes" foo="bar">this node has attributes</node3>
 <node4>other way to create content (which is also a node)</node4>
 </one><one>
 <node1>content of node 1</node1>
 <node2/>
 <node3 attribute="yes" foo="bar">this node has attributes</node3>
 <node4>other way to create content (which is also a node)</node4>
 </one><one>
 <node1>content of node 1</node1>
 <node2/>
 <node3 attribute="yes" foo="bar">this node has attributes</node3>
 <node4>other way to create content (which is also a node)</node4>
 </one><one>
 <node1>content of node 1</node1>
 <node2/>
 <node3 attribute="yes" foo="bar">this node has attributes</node3>
 <node4>other way to create content (which is also a node)</node4>
 </one><one>
 <node1>content of node 1</node1>
 <node2/>
 <node3 attribute="yes" foo="bar">this node has attributes</node3>
 <node4>other way to create content (which is also a node)</node4>
 </one><one>
 <node1>content of node 1</node1>
 <node2/>
 <node3 attribute="yes" foo="bar">this node has attributes</node3>
 <node4>other way to create content (which is also a node)</node4>
 </one><one>
 <node1>content of node 1</node1>
 <node2/>
 <node3 attribute="yes" foo="bar">this node has attributes</node3>
 <node4>other way to create content (which is also a node)</node4>
 </one></ROOT>

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對創新互聯的支持。

分享題目:C/C++利用libxml2高效輸出XML大文件詳解
本文來源:http://m.kartarina.com/article40/jecpeo.html

成都網站建設公司_創新互聯,為您提供網站維護App開發企業網站制作做網站服務器托管電子商務

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

網站建設網站維護公司
主站蜘蛛池模板: 国产激情无码一区二区三区| 亚洲AV无码日韩AV无码导航| 亚洲AV成人噜噜无码网站| 无码孕妇孕交在线观看| 亚洲2022国产成人精品无码区| 97人妻无码一区二区精品免费| 秋霞鲁丝片无码av| 18精品久久久无码午夜福利| 亚洲成A人片在线观看无码3D| 日韩精品无码久久久久久| 日韩A无码AV一区二区三区| 久久久久亚洲av无码专区导航| 国产精品99无码一区二区| 久久精品日韩av无码| 亚洲成av人片不卡无码| 东京热人妻无码一区二区av| 国产精品无码一本二本三本色| 亚洲国产精品无码第一区二区三区| 亚洲爆乳精品无码一区二区三区 | 日韩a级无码免费视频| 中文字幕AV无码一区二区三区| 无码孕妇孕交在线观看| 亚洲午夜无码久久久久| 日韩加勒比一本无码精品| 亚洲中文字幕无码av永久| 日韩网红少妇无码视频香港| 高清无码视频直接看| 人妻丰满熟妇AV无码区HD| 亚洲精品无码久久毛片| 亚洲av无码成人精品区在线播放| 无码中文av有码中文av| 亚洲AV成人无码久久WWW| 中文无码一区二区不卡αv| 亚洲一区AV无码少妇电影| 无码人妻丰满熟妇啪啪网站| 亚洲毛片无码专区亚洲乱| 亚洲熟妇无码av另类vr影视| 无码毛片AAA在线| 国产精品无码亚洲精品2021| 日韩人妻系列无码专区| 亚洲精品无码你懂的网站|