最近工作中用到了libxml2編程的知識,但是以前都不怎么熟悉過,所以看了些資料,在此做個記錄,總結下,呵呵。
一、libxml2的簡介
xml是一個實現讀、創建、以及操作xml數據功能的C語言庫。並且支持XPATH查詢,以及部分的支持XSLT轉換等的功能。
libxml2的下載地址為ftp://xmlsoft.org/libxml2/,完全版的庫是開源的,並且帶有例子的程序和說明文檔。有rpm包格式,也有tar包的形式,可以下載下來自己編譯安裝。
libxml2包含了一個腳本xml2-config,非常的方便。它一般用來編譯和鏈接程序到庫時產生的標志。為了取得預處理和編譯標志,可以使用xml2-config --cflags、為了取得鏈接標志時可用xml2-config --libs。其他的有效參數可以使用xml2-config --help進行查閱,其兩條命令的執行結果如下所示:

二、libxml2的編譯安裝
我是下載libxml2-2.8.0.tar.gz的包,先將壓縮包進行解壓,進入到libxml2-2.8.0目錄,然后進行源碼安裝的三部曲,做如下操作:
1、./configure //運行配置腳本文件,配置編譯環境
2、make //開始編譯
3、make install //結束之后libxml2即可安裝完成
三、libxml2常用數據類型
xmlChar是libxml2中的字符類型,在庫中的所有字符,字符串都是基於這個數據類型的。
xmlChar *是指針類型,很多函數都會返回一個動態分配內存的xmlChar *類型的變量,因此,在使用這類函數是要記得釋放內存,否則會導致內存泄漏,例如這樣的用法:

xmlDoc、xmlDocPtr //文檔對象結構體及指針
xmlNode、xmlNodePtr //節點對象結構體及節點指針
xmlAttr、xmlAttrPtr //節點屬性的結構體及其指針
xmlNs、xmlNsPtr //節點命名空間的結構及指針
BAD_CAST //一個宏定義,事實上它即是xmlChar *類型
四、libxml2常用函數
一、文檔相關函數
int xmlKeepBlankDefault(int val); //設置是否忽略空白的節點,在解析之前一般要調用,默認值為0,最好設置成為1
xmlDocPtr xmlParseFile(const *filename); //分析一個xml文件,並返回一個xml文檔的對象指針
xmlReadFile //讀入一個帶有某種編碼的xml文檔,並返回一個文檔指針
xmlSaveFile //將文檔以默認方式保存
xmlSaveFormatFileEnc //可將文檔以某種編碼/格式的方式進行保存
xmlFreeDoc //釋放文檔指針 注意:當調用此函數時,該文檔所包含的所有節點內存都將被自動釋放。一般來說,一個文檔中所有節點都應該動態分配然后加入文檔,然后調用xmlFreeDoc函數一次性的釋放所有節點動態分配的內存;但是當節點從文檔中移除時,就需要調用xmlFreeNode或者是xmlFreeNodeList了。
二、根節點相關函數
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 curNode, int extended); //復制當前節點
xmlNodeSetContent //設置節點內容
xmlNodeGetContent //獲取節點內容
xmlNodeListGetString //獲取字符串
四、添加子節點相關函數
xmlNodePtr xmlAddChild(xmlNodePtr parent, xmlNodePtr curNode); //給指定的節點添加子節點
xmlNodePtr xmlAddNextSibling(xmlNodePtr curNode, xmlNodePtr brother); //添加兄弟節點到后面
xmlNodePtr xmlAddPrevSibling(xmlNodePtr curNode, xmlNodePtr brother); //添加兄弟節點到前面
xmlNodePtr xmlAddSibling(xmlNodePtr curNode, xmlNodePtr brother); //添加一個兄弟節點
五、屬性相關函數
xmlAttrPtr xmlNewProp(xmlNodePtr curNode, const xmlChar *name, const xmlChar *value); //創建信節點屬性
xmlAttrPtr xmlNewProp(xmlNodePtr curNode, const xmlChar *name, const xmlChar *value); //設置新節點屬性
xmlChar *xmlGetProp(xmlNodePtr curNode, const xmlChar *name); //讀取節點屬性
六、使用XPATH查找xml文檔
使用XPATH的流程如下:
1、定義一個XPATH的上下文指針xmlXPathContextPtr context,並且使用函數xmlXPathNewContext來初始化該指針;
2、定義一個XPATH的對象指針xmlXPathObjectPtr obj,並使用函數xmlXPathEvalExpression來計算XPATH的表達式,得到查詢結果,將結果存入對象指針當中;
3、使用obj->nodesetval得到節點集合指針,在其中包含了所有查詢到的XPATH節點;
4、使用函數xmlXPathFreeContext來釋放上下文指針;
5、最后使用函數xmlXPathFreeObject釋放XPATH對象指針。
