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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章