Linux從用戶層到內核層系列 - 開源項目之Libxml2

題記:本系列文章的目的是拋開書本從源代碼和使用的角度分析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。


Libxml2的主要特性

Libmxl2 是libxml1的升級版本,現在libxml1已經停止支持和使用了。Libxml2中有一些主要的特性如:libxml2支持完整的xpath、xpointer、xinclude的實現;libxml2是支持ANSI C/POSIX標準的純C語言實現;基本支持HTTP協議和FTP協議(FTP功能可用於遠程支持xml文件的獲取和解析)等。


Libxml2在ubuntu環境下的安裝

在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支持的主要協議和國際標準

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


使用Libxml2來編寫程序

對於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構架淺析

libxml2採用了模塊化編程的思想,整個架構是由多個模塊組成的,模塊的選擇是可以根據需要裁減的,可裁剪模塊化編程的思想和linux內核有異曲同工之妙,既可以支持多種功能,有可以在有限的物理空間下裁減不需要的部分。Libxml2的主要模塊如下:

Ø  輸入輸出模塊

Ø  FTP和HTTP客戶端支持模塊(可選)

Ø  國際通用編碼支持模塊

Ø  URI模塊

Ø  XML解析模塊

Ø  SAX解析模塊

Ø  HTML解析模塊(可選)

Ø  DOM解析模塊

Ø  XPath模塊

Ø  調試模塊(可選)

 

對於libxml2的圖形化構架的描述如下圖:

 


Libxml2與XML相關的問題

對於XML語法和使用本文並沒有做出具體的討論,本文的出發點是希望提供一種跨平臺的對於XML的支持。 Libxml2的源代碼文件有3833個(libxml2-2.7.2),並在持續開發中,對於libxml2的C語言代碼編程和API說明,官方網站上有大量的實例。另外對於libxml2 BUG的提交可以訪問http://www.xmlsoft.org/bugs.html

 

 

 

 


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