记录”limxml2剖析:功能特性”之摘抄
1.概述
? ?Libxml2是一個用來解析XML文檔的函數庫。它用C語言寫成,并且能為多種語言所調用。Perl中也可以使用XML::LibXML模塊。它最初是為GNOME開發的項目,但現在可以用在各種各樣的場合。libXML2代碼可移植性非常好,因為它基于標準的ANSIC,并采用了MIT許可證。它可以移植到各種各樣的系統,包括Linux,Unix,Windows,CygWin,MacOS,MacOS X,RISC Os,OS/2, VMS, QNX, MVS, VxWorks等等。
? ?Libxml2實現了一系列與標記語言相關的標準:
? ? ?(1) XML標準:http://www.w3.org/TR/REC-xml
? ? ?(2) XML命名空間:http://www.w3.org/TR/REC-xml-names/
? ? ?(3) XML Base:http://www.w3.org/TR/xmlbase/
? ? ?(4) RFC 2396:統一資源標識符(URI),http://www.ietf.org/rfc/rfc2396.txt
? ? ?(5) XML路徑語言(XPath) 1.0:http://www.w3.org/TR/xpath
? ? ?(6) HTML4解析器:http://www.w3.org/TR/html401/
? ? ?(7) XML指針語言(XPointer)版本1.0:http://www.w3.org/TR/xptr
? ? ?(8) XML包含機制(XInclude)版本1.0:http://www.w3.org/TR/xinclude/
? ? ?(9) ISO-8859-x編碼,還有rfc2044[UTF-8]和rfc2781[UTF-16]的Unicode編碼,通過使用iconv庫,還可以支持更多其他的編碼(如亞洲語言的編碼)
? ? ? (10) SGML開放技術方案TR9401:1997的部分特性
? ? ? (11) XML目錄(XML Catalogs)工作草案:http://www.oasis-open.org/committees/entity/spec-2001-08-06.html
? ?(12)規范化XML(Canonical XML)版本1.0:http://www.w3.org/TR/xml-c14n,以及規范化算法(Exclusive XML Canonicalization CR草案) http://www.e3.org/TR/xml-exc-c14n
? ? 下面是一些獨立的文檔:
? ? ? (1) libxslt:http://xmlsoft.org/XSLT/,為libxml2提供一個XSLT 1.0的實現,和類似于EXSLT的常用擴展。
? ? ? (2) gdome2:http://gdome2.cs.unibo.it/,為libxml2提供一個標準的DOM2實現。
? ? ? (3) XMLSec:http://www.aleksey.com/xmlsec/,為libxml2提供W3C XML數字簽名(http://www.w3.org/TR/xmldsig-core/)的實現。
? ? ?Libxml2的一些關鍵特征可歸納如下:
? ? ?(1) 對XML和HTML,都提供推模式(前進式的)或拉模式(阻塞式的)的解析接口。
? ? ?(2) 使用一個要解析的文檔實例或附帶一個任意的DTD,可以再解析時做DTD驗證。
? ? ?(3) 包含完整的XPath,XPointer和XInclude實現。
? ? ?(4) 用純C編寫,盡可能少的依賴,遵循ANSI C/POSIX標準以便容易嵌入到其他程序中。可以工作在Linux/Unix/Windows上,還移植到其他的很多平臺。
? ? ? (5) 基本的HTTP和FTP客戶端支持,從而允許應用程序獲取遠程資源。
? ? ? (6) 設計是模塊化的,許多擴展可以獨立編譯。
? ? ? (7) 內部文檔表示盡可能靠近DOM接口規范。
? ? ? (8) 也提供SAX風格的接口,它被設計成與Expat兼容(http://sourceforge.net/project/expat,另外一個XML解析庫).
? ? ? (9) 本庫在MIT許可證下發布。
? 2.數據類型
? ? Libxml2定義了一些經常要用到的數據類型,以隱藏一些繁雜的底層處理。
? ? ?(1) 字符類型xmlChar
? ? ? ?這是LIbxml2中的字符類型,庫中所有字符、字符串都是基于這個數據類型。事實上它的定義在xmlstring.h中。
? ? ? typedef unsigned char xmlChar;
? ? ? ?它表示UTF-8編碼的字符串的一個字節。如果你的數據使用其他的編碼,則需要使用libxml中的函數轉換成UTF-8編碼。如同標準C中的char類型一樣,xmlChar也有相關的動態內存分配、字符串操作等函數。例如xmlMalloc是動態分配內存的函數;xmlFree是配套的釋放內存函數;xmlStrcmp是字符串比較函數等等。基本上xmlChar字符串相關函數都在xmlstring.h中定義;而動態內存分配函數在xmlmemory.h中定義。
? ? ? ? ?另外要注意,因為總是要在xmlChar*和char*之間進行類型轉換,所以定義了一個宏BAD_CAST,其定義如下(xmlstring.h):
#define BAD_CAST (xmlChar*)? ? ? ? ? 原則上來說,unsigned char * 和char *之間進行強制類型轉換時沒有問題的。
? ? ? (2) 文檔類型xmlDoc、指針xmlDocPtr
? ? ? ? 定義在tree.h中。xmlDoc是一個struct,保存了一個xml文檔的相關信息,例如文件名、文檔類型、節點樹等等;xmlDocPtr等于xmlDoc*,它搞成這個樣子總讓人以為是智能指針,其實不是,要手動刪除的。
? ? ? ? ?xmlNewDoc函數創建一個新的文檔指針。xmlParseFile函數以默認方式讀入一個UTF-8格式的文檔,并返回文檔指針。xmlReadFile函數讀入一個帶有某種編碼的xml文檔,并返回文檔指針.
? ? ? ? ? xmlFreeDoc釋放文檔指針。特別注意,當你調用xmlFreeDoc時,該文檔所有包含的節點內存都被釋放,所以一般來說不需要手動調用xmlFreeNode或者xmlFreeNodeList來釋放動態分配的節點內存,除非你把該節點從文檔中移除了。一般來說,一個文檔中所有節點都應該動態分配,然后加入文檔,最后調用xmlFreeDoc一次釋放所有節點申請的動態內存,這也是為什么我們很少看到xmlNodeFree的原因。
? ? ? ? ? xmlSaveFile將文檔以默認方式存入一個文件。xmlSaveFormatFileEnc可將文檔以某種編碼/格式存入一個文件中。
? ? ? (3) 節點類型xmlNode、指針xmlNodePtr
? ? ? ? ? ?定義在tree.h中。節點應該是xml中最重要的元素了,xmlNode代表了xml文檔中的一個幾點,實現為一個struct,內容很豐富。
/*** xmlNode** A node in an XML tree.*/ typedef struct _xmlNode xmlNode; typedef xmlNode *xmlNodePtr; struct _xmlNode {void *_private; /* application data */xmlElementType type;/*type number, must be second!*/const xmlChar *name; /* the name of the node, or the entity*/struct _xmlNode *children; /*parent->childs link */struct _xmlNode *last; /*last child link*/struct _xmlNode *parent; /*child->parent link*/struct _xmlNode *next; /* next sibling link*/struct _xmlNode *prev; /*previous sibling link */struct _xmlDoc *doc; /*the containing document*//* End of common part */xmlNs *ns; /* pointer to the associated namespace*/xmlChar *content; /*the content*/struct _xmlAttr *properties; /*properties list */xmlNs *nsDef; /*namespace definitions on this node */void *psvi; /* for type/PSVI informations*/unsigned short line; /* line number */unsigned short extra; /*extra data for XPath/XSLT */ };? ? ? ?可以看到,節點之間是以鏈表和樹兩種方式同時組織起來的,next和prev指針可以組成鏈表,而parent和children可以組織成樹。同時還有以下重要元素:節點中的文字內容content;節點所屬文檔doc;節點名字name;節點的名稱空間ns;節點屬性列表properties等。
? ? ? ? Xml文檔的操作的根本原理就是在節點之間移動、查詢節點的各項信息,并進行增加、刪除、修改的操作。xmlNodePtr指針用來遍歷文檔樹。
? ? ? ? xmlDocSetRootElement函數可以講一個節點設置為某個文檔的根節點,這是講文檔與節點連接起來的重要手段,當有了根節點后,所有子節點就可以依次連接上根節點,從而組織成為一個xml樹。
? ? ? (4) 節點集合類型xmlNodeSet、指針xmlNodeSetPtr
? ? ? ? ?節點集合代表一個由節點集組成的變量,節點集合只作為Xpath的查詢結果而出現,因此被定義在xpath.h中,其定義如下:
/** A node-set (an unordered collection of nodes without duplicates).*/ typedef struct _xmlNodeSet xmlNodeSet; typedef xmlNodeSet *xmlNodeSetPtr; struct _xmlNodeSet {int nodeNr; /* number of nodes in the set */int nodeMax; /*size of the array as allocated */xmlNodePtr *nodeTab; /*array of nodes in no particular order *//* @@ with_ns to check wether namespace nodes should be looked at @@ */ };? ? ? ? ? 可以看出,節點集合有三個成員,分別是節點集合的節點數、最大可容納的節點數,以及節點數組頭指針。對節點集合中各個節點的訪問方式很簡單,如下:
xmlNodeSetPtr nodeset = XPATH查詢結果; for (int i=0; i < nodeset->nodeNr; i++) {nodeset->nodeTab[i]; }? ? ? ? ? ?注意,libxml2是一個C函數庫,因此其函數和數據類型都使用C語言的方式來處理。如果是C++,用STL中的vector來表示一個節點集合會更好,而且沒有內存泄露或者溢出的擔憂。
總結
以上是生活随笔為你收集整理的记录”limxml2剖析:功能特性”之摘抄的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于waf的一些随想
- 下一篇: 阅读“CodeIgniter中国》文档首