如何使用libxml2庫?

2021-05-22 07:48:48 字數 4052 閱讀 6085

libxml2庫是幹什麼的?很多人就開始說,是搞xml的、解析xml格式的、讀取xml檔案的......

其實說的都不錯,但是對libxml2庫的理解狹隘了一點。

libxml2現在不僅僅可以解析xml(extensible markup language)格式,包括html(hypertext markup language)以及現時常用的超文字格式的最高層次標準sgml(standard generalized markup language)都可以解析。

下面舉幾個例子來說明:

#include

#include

#include

#include

#include

#include

#define buffersize 1024 * 1024 * 3

#define readaline 1024 * 1024 * 1

using namespace std;

int main(int argc, char *argv)

char *file = argv[1];

xmlparserctxtptr ctxt;

xmldocptr doc;

xmlnodeptr cur;

// 建立乙個parser

ctxt = xmlnewparserctxt();

// 讀取鏈結流或檔案流

doc = xmlctxtreadfile(ctxt, file, "gbk", xml_parse_dtdattr|xml_parse_noerror);

if (doc == null)

// 獲取根節點,此時的根節點可以通過cur->name獲取

cur = xmldocgetrootelement(doc);

if (cur == null)

// 獲取子節點,此時的子節點也可以通過cur->name獲取

while (cur != null) else if (!xmlstrcmp(l_cur->name, (const xmlchar *)"content"))

l_cur = l_cur->next; }

}// 繼續獲取下個子節點

cur = cur->next; }

// 釋放資源,很多網上的教程是沒有釋放資源或者釋放得不徹底

xmlfreedoc(doc);

xmlfreeparserctxt(ctxt);

xmlcleanupparser();

return 0; }

2,libxml2解析字元流(結合libcurl)

其實libxml2可以通過xmlctxtreadmemory等函式進行解析,但是這個流必須是標準的xml格式,應用範圍相對狹隘一些,這裡結合libcurl來獲取中的url資訊:

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

#ifdef _msc_ver

#define compare(a, b) (!stricmp((a), (b)))

#else

#define compare(a, b) (!strcasecmp((a), (b)))

#endif

typedef struct linkstringdefined

linkstring;

typedef struct contextdefined

bool addtitle;

string title;

string url;

vectorterms;

} context;

static char errorbuffer[curl_error_size];

static string buffer;

static int writer(char *, size_t, size_t, string *);

static bool init(curl *&, char *);

static void parsehtml(const string &, vector&);

static void startelement(void *, const xmlchar *, const xmlchar **);

static void endelement(void *, const xmlchar *);

static void characters(void *, const xmlchar *, int);

static void cdatablock(void *, const xmlchar *, int);

int main(int argc, char* argv)

curl_global_init(curl_global_default);

if (!init(conn, argv[1]))

code = curl_easy_perform(conn);

curl_easy_cleanup(conn);

if (code != curle_ok)

parsehtml(buffer, arr);

int arr_size = arr.size();

for(int i = 0; i < arr_size; i ++)

return 0; }

static bool init(curl *&conn, char *url)

code = curl_easy_setopt(conn, curlopt_errorbuffer, errorbuffer);

if (code != curle_ok)

code = curl_easy_setopt(conn, curlopt_url, url);

if (code != curle_ok)

code = curl_easy_setopt(conn, curlopt_followlocation, 1);

if (code != curle_ok)

code = curl_easy_setopt(conn, curlopt_writefunction, writer);

if (code != curle_ok)

code = curl_easy_setopt(conn, curlopt_writedata, &buffer);

if (code != curle_ok)

return true; }

static int writer(char *data, size_t size, size_t nmemb, string *writerdata)

// 關鍵點:自己可以定義節點形式(開始和結束位置)

static htmlsaxhandler saxhandler = ;

static void parsehtml(const string &html, vector&arr)

static void startelement(void *voidcontext, const xmlchar *name, const xmlchar **attributes)

} static void endelement(void *voidcontext, const xmlchar *name)

} static void handlecharacters(context *context, const xmlchar *chars, int length)

} static void characters(void *voidcontext, const xmlchar *chars, int length)

static void cdatablock(void *voidcontext, const xmlchar *chars, int length)

Libxml2庫的編譯和使用

libxml2庫提供了c語言解析和構造xml文件的介面,為後台c語言處理程式和前台應用程式提供了一種通用的通迅方式。本文以libxml2 2.6.30版本來說明libxml2庫的使用方法。1.編譯庫檔案 libxml2 2.6.30.tar.gz檔案解壓後,進入libxml2 2.6.30資料夾,順...

libxml2編譯安裝

僅作記錄學習。拷貝到ubuntu 12.04。首先進行解壓 tar zxvf libxml2 2.6.28.tar.gz 解壓到當前目錄下 cd libxml2 2.6.28 進行簡單的配置,具體的功能可以根據需求進行詳細了解 configure prefix usr local pc libxml...

libxml2 的使用方法

libxml2 庫的簡介和安裝配置 libxml2 xml解析工具 依賴libiconv zlib庫 libxml2的使用介紹 xml資料結構 xmlchar 對char的基本代替,是乙個utf 8編碼字串中的乙個位元組 xmldoc 和 xmldocptr 樹的結構 xmlnode 和 xmlno...