日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

记录”limxml2剖析:功能特性”之摘抄

發布時間:2024/1/23 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 记录”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剖析:功能特性”之摘抄的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。