題記:本系列文章的目的是拋開書本從源代碼和使用的角度分析Linux內核和相關源代碼,byhankswang和你一起玩轉linux開發
輕鬆搞定TCP/IP協議棧,原創文章歡迎交流, [email protected]
歡迎加入到CHLK - Linux開發交流羣 QQ:327084515 討論Linux開發相關問題
開源項目之Libxml2
由於工作中使用到libxml2的庫函數,並且爲libxml2提BUG和作者Daniel Veillard的交流,寫一篇小博,來簡單介紹一下libxml2。
Libxml2介紹
Libxml2的C語言版的xml解析器,項目的初衷是爲Gnome項目開發的開源工具,是一個基於MIT License的免費開源軟件(MIT License是一款比GPL/LGPL/BSD更爲寬鬆的授權條款)。 Libxml2能在Linux, Unix, Windows,CygWin, MacOS, MacOS X, RISC Os, OS/2, VMS, QNX, MVS, VxWorks等系統上良好的運行。在跨平臺數據傳輸中libxml2的兼容性非常好。Libxml2開源社區的官方網站是www.xmlsoft.org,主要作者和維護者是Daniel Veillard。
Libmxl2 是libxml1的升級版本,現在libxml1已經停止支持和使用了。Libxml2中有一些主要的特性如:libxml2支持完整的xpath、xpointer、xinclude的實現;libxml2是支持ANSI C/POSIX標準的純C語言實現;基本支持HTTP協議和FTP協議(FTP功能可用於遠程支持xml文件的獲取和解析)等。
在ubuntu中默認是不帶有Libxml2的動態庫和頭文件的,libxml2的安裝需要從libxml2的官方網站下載源代碼然後編譯安裝。步驟如下:
A: 從xmlsoft站點或ftp(ftp.xmlsoft.org)站點下載libxml2壓縮包(libxml2-xxxx.tar.gz)
B: 解壓縮源代碼的壓縮包:tar –xf libxml2-xxxx.tar.gz
C: 在源代碼文件夾中運行如下命令: ./configure -> make -> make install
D: 檢查ubuntu系統中libxml2的頭文件和動態庫文件是否安裝完畢:頭文件的安裝位置在/usr/local/include/libxml2/libxml,在該目錄下安裝了必要的編譯頭文件;libxml2的動態庫文件安裝在/usr/lib/i386-linux-gnu/目錄下。至此,libxml2已經安裝完畢了。
Libxml2支持豐富的W3C的關於xml和web的標準,主要支持的標準如下:
the XMLstandard: http://www.w3.org/TR/REC-xml
Namespaces inXML: http://www.w3.org/TR/REC-xml-names/
RFC 2396 : Uniform Resource Identifiers http://www.ietf.org/rfc/rfc2396.txt
XML Path Language(XPath) 1.0: http://www.w3.org/TR/xpath
HTML4 parser: http://www.w3.org/TR/html401/
XML Pointer Language(XPointer) Version 1.0: http://www.w3.org/TR/xptr
XML Inclusions (XInclude)Version 1.0: http://www.w3.org/TR/xinclude/
ISO-8859-x encodings,as well as rfc2044 [UTF-8] and rfc2781 [UTF-16] Unicode encodings, and more if using iconvsupport
Relax NG, ISO/IEC19757-2:2003, http://www.oasis-open.org/committees/relax-ng/spec-20011203.html
W3C XML Schemas Part2: Datatypes REC 02 May 2001
對於xml的創建、解析、修改、查找等基本功能,我們以代碼的形式來簡述libxml2的API是如何使用的,代碼的方式是以C語言的形式來編寫以GCC編譯器來編譯執行的。實例代碼中的主要函數通過藍色字體標出,以示重點。
主要函數說明:
l xmlNewDoc()用來創建XML文檔
l xmlNewNode()用來向XML文檔中添加節點
l xmlNewChild()用來向XML文檔中添加子節點
l xmlNewProp()用來設置元素和屬性
l xmlSaveFormatFileEnc()用來把XML文件從內存中拷貝到磁盤中,可以設置文件的編碼格式
#include <stdio.h>
#include <libxml/parser.h>
#include <libxml/tree.h>
int main(int argc, char **argv)
{
xmlDocPtr doc = NULL;
xmlNodePtr root_node= NULL, node = NULL, node1 = NULL;
doc = xmlNewDoc(BAD_CAST "1.0"); /* 創建一個新的xml文檔 */
root_node = xmlNewNode(NULL, BAD_CAST "root");
xmlDocSetRootElement(doc, root_node);
/* 創建新的節點,掛在根節點的下面 */
xmlNewChild(root_node, NULL, BAD_CAST"node1",BAD_CAST "content of node1");
node=xmlNewChild(root_node,NULL, BAD_CAST "node3", BAD_CAST"node has attributes");
xmlNewProp(node,BAD_CAST "attribute", BAD_CAST "yes");
node =xmlNewNode(NULL, BAD_CAST "node4");
node1 =xmlNewText(BAD_CAST"other way to create content");
xmlAddChild(node,node1);
xmlAddChild(root_node,node);
/* 把創建的XML文件從內存中導入到磁盤上 */
xmlSaveFormatFileEnc(argc> 1 ? argv[1] : "-", doc, "UTF-8", 1);
xmlFreeDoc(doc);
xmlCleanupParser();
xmlMemoryDump();//debugmemory for regression tests
return(0);
}
更多的libxml2的API的說明請參考libxml2官方網站的API說明:http://www.xmlsoft.org/html/index.html
libxml2採用了模塊化編程的思想,整個架構是由多個模塊組成的,模塊的選擇是可以根據需要裁減的,可裁剪模塊化編程的思想和linux內核有異曲同工之妙,既可以支持多種功能,有可以在有限的物理空間下裁減不需要的部分。Libxml2的主要模塊如下:
Ø 輸入輸出模塊
Ø FTP和HTTP客戶端支持模塊(可選)
Ø 國際通用編碼支持模塊
Ø URI模塊
Ø XML解析模塊
Ø SAX解析模塊
Ø HTML解析模塊(可選)
Ø DOM解析模塊
Ø XPath模塊
Ø 調試模塊(可選)
對於libxml2的圖形化構架的描述如下圖:
對於XML語法和使用本文並沒有做出具體的討論,本文的出發點是希望提供一種跨平臺的對於XML的支持。 Libxml2的源代碼文件有3833個(libxml2-2.7.2),並在持續開發中,對於libxml2的C語言代碼編程和API說明,官方網站上有大量的實例。另外對於libxml2 BUG的提交可以訪問http://www.xmlsoft.org/bugs.html。