1. 程式人生 > >libxml2庫函式詳解

libxml2庫函式詳解

許多事物符合80/20法則,libxml中也是20%的函式提供了80%的功能。下面的列表列出了libxml的主要函式及其用法說明。

1.   全域性函式說明

標頭檔案引用

xml2config --cflags

庫檔案引用

xml2config --libs

主要標頭檔案

parse.h

tree.h

xpath.h

簡單例程

Makefile:

INCLUDE=-I./ -I$HOME/include `xml2config --cflags`

LIBRARY=-L./ -L$HOME/lib `xml2config --libs`

*.c或*.cpp

#include <libxml/parse.h>

#include <libxml/tree.h>

#include <libxml/xpath.h>

函式功能

在分析XML資料是,去除空白字元。如果不去除空白字元,則這些字元也會被當做一個node來處理

函式介面

int  xmlKeepBlanksDefault(int val)

引數說明

val:0或者1。0表示去除空白字元,1表示不去除

返回值:0表示設定失敗,1表示設定成功,一般不用判斷

簡單例程

xmlKeepBlanksDefault(0);

2.   XML檔案載入和儲存函式

函式功能

將XML檔案從硬碟上載入到記憶體中,並且生成DOM樹。使用完畢之後,需要用xmlFreeDoc()來釋放資源

函式介面

xmlDocPtr xmlParseFile(const char * filename)

引數說明

filename:XML檔名稱。

返回值:如果載入成功,則返回這個文件的根節點。否則返回NULL

簡單例程

xmlDodPtr pdoc;

pdoc = xmlParseFile("123.xml");

if( pdoc == NULL )

{

     printf("Fail to parse XML file.\n");

}

函式功能

將記憶體中的DOM樹,儲存到硬碟上,生成一個帶格式的XML檔案

函式介面

int  xmlSaveFormatFileEnc(const char * filename,  xmlDocPtr cur,

     const char * encoding, int format)

引數說明

filename:需要儲存的檔案的名稱

cur:需要儲存的XML文件

encoding:匯出檔案的編碼型別,或者為NULL

format:是否格式化。0表示不格式化,1表示需要格式化。注意:只有當xmlIndentTreeOutput設定為1,或者xmlKeepBlanksDefault(0)時,format設定為1才能生效

返回值:寫入檔案中的位元組數量

簡單例程

xmlDodPtr pdoc;

pdoc = xmlParseFile("123.xml");

if( pdoc == NULL )

{

     printf("Fail to parse XML file.\n");

}

Do_something_with_pdoc();

int filesize;

filesize = xmlSaveFormatFileEnc("321.xml", pdoc, "gb2312",1);

if(filesize == -1)

{

     printf("Fail to save XML to file.\n");

}

3.   XML記憶體載入和輸出函式

函式功能

將一塊記憶體中的XML資料生成一個DOM樹。使用完畢之後,需要用xmlFreeDoc()來釋放資源

函式介面

xmlDocPtr xmlParseMemory(const char * buffer, int size)

引數說明

buffer:存放XML格式資料的記憶體區

size:記憶體中XML格式資料的長度

返回值:如果載入成功,則返回這個文件的根節點;否則返回NULL

簡單例程

char *buffer;

int size;

xmlDocPtr pdoc;

// read_data_to_buffer

buffer = ……

size = strlen(buffer);

pdoc = xmlParseMemory(buffer, size);

if( pdoc == NULL)

{

     printf("Fail to parse XML buffer.\n");

}

函式功能

將DOM樹匯出到記憶體中,形成一個XML格式的資料

函式介面

void xmlDocDumpFormatMemoryEnc(xmlDocPtr out_doc, xmlChar ** doc_txt_ptr,

     int * doc_txt_len, const char * txt_encoding, int format)

引數說明

out_doc:需要輸出成為一個buffer的XML文件

doc_txt_ptr:輸出文件的記憶體區。由該函式在內部申請。使用完成之後,必須呼叫xmlFree()函式來釋放該記憶體塊

doc_txt_len:輸出文件記憶體區的長度

txt_encoding:輸出文件的編碼型別

format:是否格式化。0表示不格式化,1表示需要格式化。注意只有當xmlIndentTreeOutput設定為1,或者xmlKeepBlanksDefault(0)時,format設定為1才能生效

簡單例程

xmlChar *outbuf;

int outlen;

xmlDocPtr pdoc;

pdoc = ……

xmlDocDumpFormatMemoryEnc(pdoc, &outbuf, &outlen, "gb2312", 1);

xmlFree(outbuf);

4.   建立和釋放XML文件函式

函式功能

在記憶體中建立一個新的XML文件。所建立的文件需要使用xmlFreeDoc()來釋放資源

函式介面

xmlDocPtr xmlNewDoc     (const xmlChar * version)

引數說明

version:XML標準的版本,目前只能指定為“1.0”

簡單例程

xmlDocPtr pdoc ;

pdoc = xmlNewDoc((const xmlChar*)"1.0");

if( pdoc == NULL )

{

     printf(“Fail to create new XML doc.\n”);

}

函式功能

釋放記憶體中的XML文件

函式介面

void xmlFreeDoc(xmlDocPtr cur)

引數說明

cur:需要釋放的XML文件

簡單例程

xmlDocPtr pdoc ;

pdoc = xmlNewDoc((const xmlChar*)"1.0");

if( pdoc == NULL )

{

     printf(“Fail to create new XML doc.\n”);

}

xmlFreeDoc(podc);

5.   XML節點操作函式

函式功能

獲得根節點

函式介面

xmlNodePtr    xmlDocGetRootElement(xmlDocPtr doc)

引數說明

doc:XML文件控制代碼。

返回值:XML文件的根節點,或者NULL。

使用流程

① 解析好文件的根節點指標,應用使用該指標可以遍歷XML檔案

② xmlNodePtr的next欄位,指向下一個同級XML節點

③ properties欄位為xmlAttr型別,指向該XML節點的屬性

④ children欄位為xmlNodePtr型別,指向該XML節點的子節點

簡單例程

xmlDocPtr pdoc ;

xmlNodePtr root ;

pdoc = xmlParseFile("123.xml");

if( pdoc == NULL )

{

     printf("Fail to parse XML File.\n");

     return ;

}

root = xmlDocGetRootElement(pdoc);

if( root == NULL)

{

     printf("Fail to get root element\n");

     return;

}

函式功能

設定根節點

函式介面

xmlNodePtr    xmlDocSetRootElement(xmlDocPtr doc, xmlNodePtr root)

引數說明

doc:XML文件控制代碼

root:XML文件的新的根節點

返回值:如果該文件原來有根節點,則返回根節點,否則返回NULL

簡單例程

xmlDocPtr pdoc ;

xmlNodePtr root;

pdoc = xmlNewDoc((const xmlChar*)"1.0");

if( pdoc == NULL )

{

     printf("Fail to create new XML doc.\n");

     return;

}

root = xmlNewDocNode(pdoc, NULL, (const xmlChar*)"root", NULL);

if( root == NULL )

{

     printf("Fail to create doc node.\n");

     return ;

}

xmlDocSetRootElement(pdoc, root);

函式功能

獲得節點的內容

函式介面

xmlChar * xmlNodeGetContent  (xmlNodePtr cur)

引數說明

cur:節點的指標

返回值:節點的文字內容。如果該節點沒有文字內容,則返回NULL。當返回值不為NULL時,需要用xmlFree()函式來釋放返回的資源

簡單例程

xmlNodePtr node;

xmlChar* content;

node = ….

content = xmlNodeGetContent(node);

xmlFree(content);

函式功能

設定節點的內容長度

函式介面

void xmlNodeSetContentLen(xmlNodePtr cur, const xmlChar * content,  int len)

引數說明

cur:節點的指標

content:節點的新文字內容

len:節點新文字內容的長度

簡單例程

xmlNodePtr node;

xmlChar* content;

int len;

content = (xmlChar*)"1234567890";

len = strlen((char*)content);

xmlNodeSetContentLen(node, content, len);

函式功能

在節點的內容後面新增新的內容

函式介面

void xmlNodeAddContentLen(xmlNodePtr cur,  const xmlChar * content,  int len)

引數說明

cur:節點的指標

content:節點的新加的文字內容

len:節點新加的文字內容的長度

簡單例程

xmlNodePtr node;

xmlChar* content;

int len;

content = (xmlChar*)"1234567890";

len = strlen((char*)content);

xmlNodeAddContentLen(node, content, len);

函式功能

獲得節點的屬性

函式介面

xmlChar * xmlGetProp(xmlNodePtr node, const xmlChar * name)

引數說明

node:XML節點的指標

name:該節點的屬性的名稱

返回值:該屬性的值或者為NULL。如果不為NULL,則需要用xmlFree()來釋放資源

簡單例程

xmlNodePtr node;

xmlChar* prop;

node = ….

prop = xmlGetProp(node, (const xmlChar*)"name");

if( prop != NULL)

     xmlFree(prop);

函式功能

設定節點的屬性(如果該屬性已經存在,則替換其值)

函式介面

xmlAttrPtr xmlSetProp(xmlNodePtr node, const xmlChar * name, const xmlChar * value)

引數說明

node:需要設定屬性的節點

name:屬性的名稱

value:屬性的值

返回值:該屬性節點的指標

簡單例程

xmlNodePtr node;

xmlAttrPtr attr;

node = ….

attr = xmlSetProp(node, (cosnt xmlChar*)"Dept-Name", (const xmlChar*)"ES");

if( attr == NULL)

{

     printf("Fail to set prop of this node.\n");

}

6.   XPath函式

函式功能

生成xpath的上下文關係控制代碼

函式介面

xmlXPathContextPtr xmlXPathNewContext(xmlDocPtr doc)

引數說明

doc:需要處理的XML文件

返回值:該文件的XPath上下文關係控制代碼或者NULL。該返回控制代碼由函式內部申請,此函式呼叫者需要用xmlXPathFreeContext來釋放

簡單例程

xmlDocPtr pdoc;

xmlXPathContextPtr xpathctx;

pdoc = ….

xpathctx = xmlXPathNewContext(pdoc);

if( xpathctx != NULL)

     xmlXPathFreeContext(xpathctx);

函式功能

釋放xpath的上下文關係控制代碼

函式介面

void xmlXPathFreeContext(xmlXPathContextPtr ctxt)

引數說明

ctxt:需要釋放的xpath上下文關係控制代碼

簡單例程

參見xmlXPathNewContext()的例程

函式功能

執行xpath的表示式,返回結果內容節點集合

XPath表示式的表示方法,請參考:

http://www.zvon.org/xxl/XPathTutorial/General/examples.html

函式介面

xmlXPathObjectPtr  xmlXPathEvalExpression (const xmlChar * str,

                             xmlXPathContextPtr ctxt)

引數說明

str:xpath表示式

ctxt:xpath的上下文關係控制代碼

返回值:滿足表示式的結果集合或者為NULL。該返回控制代碼由函式內部申請,此函式呼叫者需要用xmlXPathFreeObject()來釋放

簡單例程

xmlDocPtr pdoc;

xmlXPathContextPtr xpathctx;

xmlXPathObjectPtr xpathobj;

pdoc = ….

xpathctx = xmlXPathNewContext(pdoc);

if( xpathctx == NULL)

{

     printf("Fail to create xpath context.\n");

     return ;

}

Xpathobj = xmlXPathEvalExpression(BAD_CAST "//@value", xpathctx);

if( xpathobj == NULL)

{

     printf("Fail to evaluate xpath expression.\n");

     xmlXPathFreeContext(xpathctx);

     return;

}

xmlXPathFreeObject(xpathobj);

xmlXPathFreeContext(xpathctx);

結果集說明:

xpathobj-> nodesetval:儲存結果列表,如果為NULL,表示無結果

xpathObj->nodesetval->nodeNr:表示結果的數量

xpathObj->nodesetval->nodeTab:表示結果的陣列,可以通過下標訪問

例如:

int number;

xmlNodePtr node;

if( xpathobj-> nodesetval == NULL)

     number = 0;

else

     number = xpathObj->nodesetval->nodeNr;

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

{

     node = xpathObj->nodesetval->nodeTab[i];

     do_some_work_with_node();

}

函式功能

釋放xpath表示式運算結果集

函式介面

void xmlXPathFreeObject(xmlXPathObjectPtr obj)

引數說明

obj:需要釋放的xpath表示式運算結果集合

簡單例程

參見xmlXPathEvalExpression()的例程

7.   XML常見使用函式列表

下文是對XML常見使用函式的簡要說明,有些函式的具體說明見上面的表格。

<libxml/parser.h>

 int xmlKeepBlanksDefault (int val) //設定是否忽略空白節點,比如空格,在分析前必須呼叫,預設值是0,最好設定成1。

xmlDocPtr xmlParseFile (const char * filename) //分析一個xml檔案,並返回一個文件物件指標

<libxml/tree.h>

//xml操作的基礎結構提及其指標型別

//xmlDoc  xmlDocPtr 文件物件的結構體及其指標

//xmlNode xmlNodePtr 節點物件的結構體及其指標

//xmlAttr xmlAttrPtr 節點屬性的結構體及其指標

//xmlNs xmlNsPtr 節點名稱空間的結構及其指標

//根節點相關函式

xmlNodePtr xmlDocGetRootElement (xmlDocPtr doc) //獲取文件根節點

xmlNodePtr xmlDocSetRootElement (xmlDocPtr doc, xmlNodePtr root) //設定文件根節點

//建立子節點相關函式

xmlNodePtr xmlNewNode (xmlNsPtr ns, const xmlChar * name) //建立新節點

xmlNodePtr xmlNewChild (xmlNodePtr parent, xmlNsPtr ns, const xmlChar * name, const xmlChar * content) //建立新的子節點

xmlNodePtr xmlCopyNode (const xmlNodePtr node, int extended) //複製當前節點

//新增子節點相關函式

xmlNodePtr xmlAddChild (xmlNodePtr parent, xmlNodePtr cur) //給指定節點新增子節點

xmlNodePtr xmlAddNextSibling (xmlNodePtr cur, xmlNodePtr elem) //新增後一個兄弟節點

xmlNodePtr xmlAddPrevSibling (xmlNodePtr cur, xmlNodePtr elem) //新增前一個兄弟節點

xmlNodePtr xmlAddSibling (xmlNodePtr cur, xmlNodePtr elem) //新增兄弟節點

//屬性相關函式

xmlAttrPtr xmlNewProp (xmlNodePtr node, const xmlChar * name, const xmlChar * value) //建立新節點屬性

xmlChar * xmlGetProp (xmlNodePtr node, const xmlChar * name) //讀取節點屬性

xmlAttrPtr xmlSetProp (xmlNodePtr node, const xmlChar * name, const xmlChar * value) //設定節點屬性

//作用同尾部同名的字串函式。只不過針對相應的xml節點

xmlChar* xmlStrcat (xmlChar *cur, const xmlChar * add)

const xmlChar *xmlStrchr(const xmlChar * str, xmlChar val)

int xmlStrcmp (const xmlChar * str1, const xmlChar * str2)

int xmlStrlen (const xmlChar * str)

xmlChar *xmlStrncat (xmlChar * cur, const xmlChar * add, int len)

int xmlStrncmp (const xmlChar * str1, const xmlChar * str2, int len)

const xmlChar *xmlStrstr (const xmlChar * str, const xmlChar * val

相關推薦

libxml2函式

許多事物符合80/20法則,libxml中也是20%的函式提供了80%的功能。下面的列表列出了libxml的主要函式及其用法說明。 1.   全域性函式說明 標頭檔案引用 xml2config --cflags 庫檔案引用 xml2config -

STM32函式----(外部中斷/事件控制器 EXTI)

1.void EXTI_DeInit  (void) 函式解釋:將EXTI外設暫存器重置為默註釋。RCC_APB2PeriphResetCmd引數中沒有EXTI外設的的巨集,該外設重置採取的是直接向暫存器賦預設值的操作。 例子:EXTI_DeInit ( );  

STM32函式----(通用輸入/輸出GPIO)

初始化和配置相關函式 1.void  GPIO_DeInit  (GPIO_TypeDef* GPIOx) 函式解釋:gpio的反初始化函式,該函式的作用是把GPIO相關的暫存器配置成上電覆位後的預設狀態,在第一次初始化前或者不在使用某一介面後,可以呼叫該函式。 引數

#include 函式

time.h 有人總結成這麼幾句,的確是經典,自己好好程式設計試試效果吧, 兩個型別: time_t:表示距離 UTC 時間 1970-01-01 00:00:00 的秒數。也叫做日曆時,型別是  long clock_t: 只用於程式計時,貌似其他的沒它什麼事。struc

C++面試常見的幾個函式

strcpy() 原型宣告:char strcpy(char dest, const char *src);  功能:把從src地址開始且含有NULL結束符的字串複製到以dest開始的地址空間  說明:src和dest所指記憶體區域不可以重疊且dest必須有足夠的空間來容

C程式中對時間的處理——time函式

  功 能:將時間格式化,或者說:格式化一個時間字串。我們可以使用strftime()函式將時間格式化為我們想要的格式。   原 型:size_t strftime(char *strDest,size_t maxsize,const char *format,const struct tm *timept

STM32 DSP函式

對於每個函式,都存在浮點數和定點數的型別,由於使用方法是一致的,這裡我們僅以32為浮點數為例來說明。 一.BasicMathFunctions 1.絕對值 pDst[n] = abs(pSrc[n]), 0 <= n < blockSize 示例 float3

PLSQL連接Oracle 數據配置

evel 目錄 win32 asi ges network con 配置詳解 soft 1. 下載instantclient-basic-win32-11.2.0.1.0 (oracle官網下載地址:http://www.oracle.com/technetwork/t

oracle數據歸檔

oracle什麽是Oracle歸檔模式? Oracle數據庫有聯機重做日誌,這個日誌是記錄對數據庫所做的修改,比如插入,刪除,更新數據等,對這些操作都會記錄在聯機重做日誌裏。一般數據庫至少要有2個聯機重做日誌組。當一個聯機重做日誌組被寫滿的時候,就會發生日誌切換,這時聯機重做日誌組2成為當前使用的日誌,當聯機

JMeter數據操作

idt .cn username logs word api family -1 用戶名 Jmeter提供了JDBC連接的插件,通過執行SQL語句的java API,實現對數據庫的訪問和查詢。 一、安裝驅動包   將需要連接JDBC的jar包放入jmeter安裝文件的lib

11.Python-第三方requests(三)

raise upload int exce strong gbk auth 並且 exc Response對象 使用requests方法後,會返回一個response對象,其存儲了服務器響應的內容,如上實例中已經提到的 r.text、r.status_code……獲取文本方

深入探討Linux靜態與動態(轉)

share 分享 命名 one .com 過程 程序 簡單介紹 mage 2.生成動態庫並使用 linux下編譯時通過 -shared 參數可以生成動態庫(.so)文件,如下 庫從本質上來說是一種可執行代碼的二進制格式,可以被載入內存中執行。庫分靜態庫和動態庫兩種。

大數據量高並發的數據優化(MSSQL)

臨時表 引用 edi 強制 順序存儲 實現 好的 float 空間 轉載自:http://www.jb51.net/article/71041.htm 如果不能設計一個合理的數據庫模型,不僅會增加客戶端和服務器段程序的編程和維護的難度,而且將會影響系統實際運行的性能。所以,

數據規範

ipv4 舉例 eat sta 改變 image 字母 lin use 一、數據庫的庫名、表名、字段名命名規範: 1、駝峰表示法:即參考java中命名變量名的規範來命名,也就是如果只有一個單詞時,全部小寫;多個單詞時,第一個單詞全小寫,後面的所有單詞都是首字母大寫。舉

Oracle數據序列

art term ffffff TP 執行 清空 調用 滿足 sel 前言: 做過web開發的人員基本上都知道,數據庫表中的主鍵值有的時候我們會用數字類型的並且自增。這樣mysql、sql server中的都可以使用工具創建表的時候很容易實現。但是oracle中沒有設置自增

NCBI SRA數據使用

macos study trace bsp 使用詳解 srx inf 下載地址 fetch 轉:https://shengxin.ren/article/16 https://www.cnblogs.com/lmt921108/p/7442699.html SRA(

【Python爬蟲學習筆記8-2】MongoDB數據操作

參考資料 adding ocl 切換 username 詳解 top .com min 上一篇學習筆記8-1中介紹了MySQL和MongoDB的安裝、啟動和配置,本節我們接著學習有關MongoDB的一些概念、基本操作和在python中的使用。 MongoDB常用概念 為更好

Linux下oracle12c數據安裝

shadow follow glibc 格式化磁盤 www ech etc 12c 接收 簡介: oracle12c概述 oracle12c數據庫屬於關系型數據庫,采用C/S模式、支持SQL語言,穩定性、高性能、安全性優於其他官方網站: https://www.oracle

MySQL 的函式

完整性約束 什麼是資料完整性 資料的準確性和可靠性。 分類 實體完整性 記錄準確的。(記錄不能重複) 主鍵約束: 不能重複,不能為空。  Primary key 欄位唯一的。 不能使用業務欄位。 無意義的

PyQuery使用

PyQuery是python中一個強大而又靈活的網頁解析庫,如果你覺得正則寫起來太麻煩,又覺得BeautifulSoup語法太難記,如果你熟悉jQuery的語法那麼,PyQuery就是你絕佳的選擇。 安裝:pip3 install pyquery 一、初始化 下面介紹三種初始化PyQ