libxml2庫函式詳解
許多事物符合80/20法則,libxml中也是20%的函式提供了80%的功能。下面的列表列出了libxml的主要函式及其用法說明。
1. 全域性函式說明
標頭檔案引用 |
xml2config --cflags |
庫檔案引用 |
xml2config --libs |
主要標頭檔案 |
parse.h tree.h xpath.h |
簡單例程 |
Makefile: INCLUDE=-I./ -I$HOME/include `xml2config --cflags` LIBRARY=-L./ -L$HOME/lib `xml2config --libs` *.c或*.cpp #include <libxml/parse.h> #include <libxml/tree.h> #include <libxml/xpath.h> |
函式功能 |
在分析XML資料是,去除空白字元。如果不去除空白字元,則這些字元也會被當做一個node來處理 |
函式介面 |
int xmlKeepBlanksDefault(int val) |
引數說明 |
val:0或者1。0表示去除空白字元,1表示不去除 返回值:0表示設定失敗,1表示設定成功,一般不用判斷 |
簡單例程 |
xmlKeepBlanksDefault(0); |
2. XML檔案載入和儲存函式
函式功能 |
將XML檔案從硬碟上載入到記憶體中,並且生成DOM樹。使用完畢之後,需要用xmlFreeDoc()來釋放資源 |
函式介面 |
xmlDocPtr xmlParseFile(const char * filename) |
引數說明 |
filename:XML檔名稱。 返回值:如果載入成功,則返回這個文件的根節點。否則返回NULL |
簡單例程 |
xmlDodPtr pdoc; pdoc = xmlParseFile("123.xml"); if( pdoc == NULL ) { printf("Fail to parse XML file.\n"); } |
函式功能 |
將記憶體中的DOM樹,儲存到硬碟上,生成一個帶格式的XML檔案 |
函式介面 |
int xmlSaveFormatFileEnc(const char * filename, xmlDocPtr cur, const char * encoding, int format) |
引數說明 |
filename:需要儲存的檔案的名稱 cur:需要儲存的XML文件 encoding:匯出檔案的編碼型別,或者為NULL format:是否格式化。0表示不格式化,1表示需要格式化。注意:只有當xmlIndentTreeOutput設定為1,或者xmlKeepBlanksDefault(0)時,format設定為1才能生效 返回值:寫入檔案中的位元組數量 |
簡單例程 |
xmlDodPtr pdoc; pdoc = xmlParseFile("123.xml"); if( pdoc == NULL ) { printf("Fail to parse XML file.\n"); } Do_something_with_pdoc(); int filesize; filesize = xmlSaveFormatFileEnc("321.xml", pdoc, "gb2312",1); if(filesize == -1) { printf("Fail to save XML to file.\n"); } |
3. XML記憶體載入和輸出函式
函式功能 |
將一塊記憶體中的XML資料生成一個DOM樹。使用完畢之後,需要用xmlFreeDoc()來釋放資源 |
函式介面 |
xmlDocPtr xmlParseMemory(const char * buffer, int size) |
引數說明 |
buffer:存放XML格式資料的記憶體區 size:記憶體中XML格式資料的長度 返回值:如果載入成功,則返回這個文件的根節點;否則返回NULL |
簡單例程 |
char *buffer; int size; xmlDocPtr pdoc; // read_data_to_buffer buffer = …… size = strlen(buffer); pdoc = xmlParseMemory(buffer, size); if( pdoc == NULL) { printf("Fail to parse XML buffer.\n"); } |
函式功能 |
將DOM樹匯出到記憶體中,形成一個XML格式的資料 |
函式介面 |
void xmlDocDumpFormatMemoryEnc(xmlDocPtr out_doc, xmlChar ** doc_txt_ptr, int * doc_txt_len, const char * txt_encoding, int format) |
引數說明 |
out_doc:需要輸出成為一個buffer的XML文件 doc_txt_ptr:輸出文件的記憶體區。由該函式在內部申請。使用完成之後,必須呼叫xmlFree()函式來釋放該記憶體塊 doc_txt_len:輸出文件記憶體區的長度 txt_encoding:輸出文件的編碼型別 format:是否格式化。0表示不格式化,1表示需要格式化。注意只有當xmlIndentTreeOutput設定為1,或者xmlKeepBlanksDefault(0)時,format設定為1才能生效 |
簡單例程 |
xmlChar *outbuf; int outlen; xmlDocPtr pdoc; pdoc = …… xmlDocDumpFormatMemoryEnc(pdoc, &outbuf, &outlen, "gb2312", 1); xmlFree(outbuf); |
4. 建立和釋放XML文件函式
函式功能 |
在記憶體中建立一個新的XML文件。所建立的文件需要使用xmlFreeDoc()來釋放資源 |
函式介面 |
xmlDocPtr xmlNewDoc (const xmlChar * version) |
引數說明 |
version:XML標準的版本,目前只能指定為“1.0” |
簡單例程 |
xmlDocPtr pdoc ; pdoc = xmlNewDoc((const xmlChar*)"1.0"); if( pdoc == NULL ) { printf(“Fail to create new XML doc.\n”); } |
函式功能 |
釋放記憶體中的XML文件 |
函式介面 |
void xmlFreeDoc(xmlDocPtr cur) |
引數說明 |
cur:需要釋放的XML文件 |
簡單例程 |
xmlDocPtr pdoc ; pdoc = xmlNewDoc((const xmlChar*)"1.0"); if( pdoc == NULL ) { printf(“Fail to create new XML doc.\n”); } xmlFreeDoc(podc); |
5. XML節點操作函式
函式功能 |
獲得根節點 |
函式介面 |
xmlNodePtr xmlDocGetRootElement(xmlDocPtr doc) |
引數說明 |
doc:XML文件控制代碼。 返回值:XML文件的根節點,或者NULL。 |
使用流程 |
① 解析好文件的根節點指標,應用使用該指標可以遍歷XML檔案 ② xmlNodePtr的next欄位,指向下一個同級XML節點 ③ properties欄位為xmlAttr型別,指向該XML節點的屬性 ④ children欄位為xmlNodePtr型別,指向該XML節點的子節點 |
簡單例程 |
xmlDocPtr pdoc ; xmlNodePtr root ; pdoc = xmlParseFile("123.xml"); if( pdoc == NULL ) { printf("Fail to parse XML File.\n"); return ; } root = xmlDocGetRootElement(pdoc); if( root == NULL) { printf("Fail to get root element\n"); return; } |
函式功能 |
設定根節點 |
函式介面 |
xmlNodePtr xmlDocSetRootElement(xmlDocPtr doc, xmlNodePtr root) |
引數說明 |
doc:XML文件控制代碼 root:XML文件的新的根節點 返回值:如果該文件原來有根節點,則返回根節點,否則返回NULL |
簡單例程 |
xmlDocPtr pdoc ; xmlNodePtr root; pdoc = xmlNewDoc((const xmlChar*)"1.0"); if( pdoc == NULL ) { printf("Fail to create new XML doc.\n"); return; } root = xmlNewDocNode(pdoc, NULL, (const xmlChar*)"root", NULL); if( root == NULL ) { printf("Fail to create doc node.\n"); return ; } xmlDocSetRootElement(pdoc, root); |
函式功能 |
獲得節點的內容 |
函式介面 |
xmlChar * xmlNodeGetContent (xmlNodePtr cur) |
引數說明 |
cur:節點的指標 返回值:節點的文字內容。如果該節點沒有文字內容,則返回NULL。當返回值不為NULL時,需要用xmlFree()函式來釋放返回的資源 |
簡單例程 |
xmlNodePtr node; xmlChar* content; node = …. content = xmlNodeGetContent(node); xmlFree(content); |
函式功能 |
設定節點的內容長度 |
函式介面 |
void xmlNodeSetContentLen(xmlNodePtr cur, const xmlChar * content, int len) |
引數說明 |
cur:節點的指標 content:節點的新文字內容 len:節點新文字內容的長度 |
簡單例程 |
xmlNodePtr node; xmlChar* content; int len; content = (xmlChar*)"1234567890"; len = strlen((char*)content); xmlNodeSetContentLen(node, content, len); |
函式功能 |
在節點的內容後面新增新的內容 |
函式介面 |
void xmlNodeAddContentLen(xmlNodePtr cur, const xmlChar * content, int len) |
引數說明 |
cur:節點的指標 content:節點的新加的文字內容 len:節點新加的文字內容的長度 |
簡單例程 |
xmlNodePtr node; xmlChar* content; int len; content = (xmlChar*)"1234567890"; len = strlen((char*)content); xmlNodeAddContentLen(node, content, len); |
函式功能 |
獲得節點的屬性 |
函式介面 |
xmlChar * xmlGetProp(xmlNodePtr node, const xmlChar * name) |
引數說明 |
node:XML節點的指標 name:該節點的屬性的名稱 返回值:該屬性的值或者為NULL。如果不為NULL,則需要用xmlFree()來釋放資源 |
簡單例程 |
xmlNodePtr node; xmlChar* prop; node = …. prop = xmlGetProp(node, (const xmlChar*)"name"); if( prop != NULL) xmlFree(prop); |
函式功能 |
設定節點的屬性(如果該屬性已經存在,則替換其值) |
函式介面 |
xmlAttrPtr xmlSetProp(xmlNodePtr node, const xmlChar * name, const xmlChar * value) |
引數說明 |
node:需要設定屬性的節點 name:屬性的名稱 value:屬性的值 返回值:該屬性節點的指標 |
簡單例程 |
xmlNodePtr node; xmlAttrPtr attr; node = …. attr = xmlSetProp(node, (cosnt xmlChar*)"Dept-Name", (const xmlChar*)"ES"); if( attr == NULL) { printf("Fail to set prop of this node.\n"); } |
6. XPath函式
函式功能 |
生成xpath的上下文關係控制代碼 |
函式介面 |
xmlXPathContextPtr xmlXPathNewContext(xmlDocPtr doc) |
引數說明 |
doc:需要處理的XML文件 返回值:該文件的XPath上下文關係控制代碼或者NULL。該返回控制代碼由函式內部申請,此函式呼叫者需要用xmlXPathFreeContext來釋放 |
簡單例程 |
xmlDocPtr pdoc; xmlXPathContextPtr xpathctx; pdoc = …. xpathctx = xmlXPathNewContext(pdoc); if( xpathctx != NULL) xmlXPathFreeContext(xpathctx); |
函式功能 |
釋放xpath的上下文關係控制代碼 |
函式介面 |
void xmlXPathFreeContext(xmlXPathContextPtr ctxt) |
引數說明 |
ctxt:需要釋放的xpath上下文關係控制代碼 |
簡單例程 |
參見xmlXPathNewContext()的例程 |
函式功能 |
執行xpath的表示式,返回結果內容節點集合 XPath表示式的表示方法,請參考: http://www.zvon.org/xxl/XPathTutorial/General/examples.html |
函式介面 |
xmlXPathObjectPtr xmlXPathEvalExpression (const xmlChar * str, xmlXPathContextPtr ctxt) |
引數說明 |
str:xpath表示式 ctxt:xpath的上下文關係控制代碼 返回值:滿足表示式的結果集合或者為NULL。該返回控制代碼由函式內部申請,此函式呼叫者需要用xmlXPathFreeObject()來釋放 |
簡單例程 |
xmlDocPtr pdoc; xmlXPathContextPtr xpathctx; xmlXPathObjectPtr xpathobj; pdoc = …. xpathctx = xmlXPathNewContext(pdoc); if( xpathctx == NULL) { printf("Fail to create xpath context.\n"); return ; } Xpathobj = xmlXPathEvalExpression(BAD_CAST "//@value", xpathctx); if( xpathobj == NULL) { printf("Fail to evaluate xpath expression.\n"); xmlXPathFreeContext(xpathctx); return; } xmlXPathFreeObject(xpathobj); xmlXPathFreeContext(xpathctx); 結果集說明: xpathobj-> nodesetval:儲存結果列表,如果為NULL,表示無結果 xpathObj->nodesetval->nodeNr:表示結果的數量 xpathObj->nodesetval->nodeTab:表示結果的陣列,可以通過下標訪問 例如: int number; xmlNodePtr node; if( xpathobj-> nodesetval == NULL) number = 0; else number = xpathObj->nodesetval->nodeNr; for(int i=0;i<number;i++) { node = xpathObj->nodesetval->nodeTab[i]; do_some_work_with_node(); } |
函式功能 |
釋放xpath表示式運算結果集 |
函式介面 |
void xmlXPathFreeObject(xmlXPathObjectPtr obj) |
引數說明 |
obj:需要釋放的xpath表示式運算結果集合 |
簡單例程 |
參見xmlXPathEvalExpression()的例程 |
7. XML常見使用函式列表
下文是對XML常見使用函式的簡要說明,有些函式的具體說明見上面的表格。
<libxml/parser.h>
int xmlKeepBlanksDefault (int val) //設定是否忽略空白節點,比如空格,在分析前必須呼叫,預設值是0,最好設定成1。
xmlDocPtr xmlParseFile (const char * filename) //分析一個xml檔案,並返回一個文件物件指標
<libxml/tree.h>
//xml操作的基礎結構提及其指標型別
//xmlDoc xmlDocPtr 文件物件的結構體及其指標
//xmlNode xmlNodePtr 節點物件的結構體及其指標
//xmlAttr xmlAttrPtr 節點屬性的結構體及其指標
//xmlNs xmlNsPtr 節點名稱空間的結構及其指標
//根節點相關函式
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 node, int extended) //複製當前節點
//新增子節點相關函式
xmlNodePtr xmlAddChild (xmlNodePtr parent, xmlNodePtr cur) //給指定節點新增子節點
xmlNodePtr xmlAddNextSibling (xmlNodePtr cur, xmlNodePtr elem) //新增後一個兄弟節點
xmlNodePtr xmlAddPrevSibling (xmlNodePtr cur, xmlNodePtr elem) //新增前一個兄弟節點
xmlNodePtr xmlAddSibling (xmlNodePtr cur, xmlNodePtr elem) //新增兄弟節點
//屬性相關函式
xmlAttrPtr xmlNewProp (xmlNodePtr node, const xmlChar * name, const xmlChar * value) //建立新節點屬性
xmlChar * xmlGetProp (xmlNodePtr node, const xmlChar * name) //讀取節點屬性
xmlAttrPtr xmlSetProp (xmlNodePtr node, const xmlChar * name, const xmlChar * value) //設定節點屬性
//作用同尾部同名的字串函式。只不過針對相應的xml節點
xmlChar* xmlStrcat (xmlChar *cur, const xmlChar * add)
const xmlChar *xmlStrchr(const xmlChar * str, xmlChar val)
int xmlStrcmp (const xmlChar * str1, const xmlChar * str2)
int xmlStrlen (const xmlChar * str)
xmlChar *xmlStrncat (xmlChar * cur, const xmlChar * add, int len)
int xmlStrncmp (const xmlChar * str1, const xmlChar * str2, int len)
const xmlChar *xmlStrstr (const xmlChar * str, const xmlChar * val
相關推薦
libxml2庫函式詳解
許多事物符合80/20法則,libxml中也是20%的函式提供了80%的功能。下面的列表列出了libxml的主要函式及其用法說明。 1. 全域性函式說明 標頭檔案引用 xml2config --cflags 庫檔案引用 xml2config -
STM32庫函式詳解----(外部中斷/事件控制器 EXTI)
1.void EXTI_DeInit (void) 函式解釋:將EXTI外設暫存器重置為默註釋。RCC_APB2PeriphResetCmd引數中沒有EXTI外設的的巨集,該外設重置採取的是直接向暫存器賦預設值的操作。 例子:EXTI_DeInit ( );
STM32庫函式詳解----(通用輸入/輸出GPIO)
初始化和配置相關函式 1.void GPIO_DeInit (GPIO_TypeDef* GPIOx) 函式解釋:gpio的反初始化函式,該函式的作用是把GPIO相關的暫存器配置成上電覆位後的預設狀態,在第一次初始化前或者不在使用某一介面後,可以呼叫該函式。 引數
#include 庫函式詳解
time.h 有人總結成這麼幾句,的確是經典,自己好好程式設計試試效果吧, 兩個型別: time_t:表示距離 UTC 時間 1970-01-01 00:00:00 的秒數。也叫做日曆時,型別是 long clock_t: 只用於程式計時,貌似其他的沒它什麼事。struc
C++面試常見的幾個庫函式詳解
strcpy() 原型宣告:char strcpy(char dest, const char *src); 功能:把從src地址開始且含有NULL結束符的字串複製到以dest開始的地址空間 說明:src和dest所指記憶體區域不可以重疊且dest必須有足夠的空間來容
C程式中對時間的處理——time庫函式詳解
功 能:將時間格式化,或者說:格式化一個時間字串。我們可以使用strftime()函式將時間格式化為我們想要的格式。 原 型:size_t strftime(char *strDest,size_t maxsize,const char *format,const struct tm *timept
STM32 DSP庫函式詳解
對於每個函式,都存在浮點數和定點數的型別,由於使用方法是一致的,這裡我們僅以32為浮點數為例來說明。 一.BasicMathFunctions 1.絕對值 pDst[n] = abs(pSrc[n]), 0 <= n < blockSize 示例 float3
PLSQL連接Oracle 數據庫配置詳解
evel 目錄 win32 asi ges network con 配置詳解 soft 1. 下載instantclient-basic-win32-11.2.0.1.0 (oracle官網下載地址:http://www.oracle.com/technetwork/t
oracle數據庫歸檔詳解
oracle什麽是Oracle歸檔模式? Oracle數據庫有聯機重做日誌,這個日誌是記錄對數據庫所做的修改,比如插入,刪除,更新數據等,對這些操作都會記錄在聯機重做日誌裏。一般數據庫至少要有2個聯機重做日誌組。當一個聯機重做日誌組被寫滿的時候,就會發生日誌切換,這時聯機重做日誌組2成為當前使用的日誌,當聯機
JMeter數據庫操作詳解
idt .cn username logs word api family -1 用戶名 Jmeter提供了JDBC連接的插件,通過執行SQL語句的java API,實現對數據庫的訪問和查詢。 一、安裝驅動包 將需要連接JDBC的jar包放入jmeter安裝文件的lib
11.Python-第三方庫requests詳解(三)
raise upload int exce strong gbk auth 並且 exc Response對象 使用requests方法後,會返回一個response對象,其存儲了服務器響應的內容,如上實例中已經提到的 r.text、r.status_code……獲取文本方
深入探討Linux靜態庫與動態庫的詳解(轉)
share 分享 命名 one .com 過程 程序 簡單介紹 mage 2.生成動態庫並使用 linux下編譯時通過 -shared 參數可以生成動態庫(.so)文件,如下 庫從本質上來說是一種可執行代碼的二進制格式,可以被載入內存中執行。庫分靜態庫和動態庫兩種。
大數據量高並發的數據庫優化詳解(MSSQL)
臨時表 引用 edi 強制 順序存儲 實現 好的 float 空間 轉載自:http://www.jb51.net/article/71041.htm 如果不能設計一個合理的數據庫模型,不僅會增加客戶端和服務器段程序的編程和維護的難度,而且將會影響系統實際運行的性能。所以,
數據庫規範詳解
ipv4 舉例 eat sta 改變 image 字母 lin use 一、數據庫的庫名、表名、字段名命名規範: 1、駝峰表示法:即參考java中命名變量名的規範來命名,也就是如果只有一個單詞時,全部小寫;多個單詞時,第一個單詞全小寫,後面的所有單詞都是首字母大寫。舉
Oracle數據庫序列詳解
art term ffffff TP 執行 清空 調用 滿足 sel 前言: 做過web開發的人員基本上都知道,數據庫表中的主鍵值有的時候我們會用數字類型的並且自增。這樣mysql、sql server中的都可以使用工具創建表的時候很容易實現。但是oracle中沒有設置自增
NCBI SRA數據庫使用詳解
macos study trace bsp 使用詳解 srx inf 下載地址 fetch 轉:https://shengxin.ren/article/16 https://www.cnblogs.com/lmt921108/p/7442699.html SRA(
【Python爬蟲學習筆記8-2】MongoDB數據庫操作詳解
參考資料 adding ocl 切換 username 詳解 top .com min 上一篇學習筆記8-1中介紹了MySQL和MongoDB的安裝、啟動和配置,本節我們接著學習有關MongoDB的一些概念、基本操作和在python中的使用。 MongoDB常用概念 為更好
Linux下oracle12c數據庫安裝詳解
shadow follow glibc 格式化磁盤 www ech etc 12c 接收 簡介: oracle12c概述 oracle12c數據庫屬於關系型數據庫,采用C/S模式、支持SQL語言,穩定性、高性能、安全性優於其他官方網站: https://www.oracle
MySQL 的函式詳解!
完整性約束 什麼是資料完整性 資料的準確性和可靠性。 分類 實體完整性 記錄準確的。(記錄不能重複) 主鍵約束: 不能重複,不能為空。 Primary key 欄位唯一的。 不能使用業務欄位。 無意義的
PyQuery庫使用詳解
PyQuery是python中一個強大而又靈活的網頁解析庫,如果你覺得正則寫起來太麻煩,又覺得BeautifulSoup語法太難記,如果你熟悉jQuery的語法那麼,PyQuery就是你絕佳的選擇。 安裝:pip3 install pyquery 一、初始化 下面介紹三種初始化PyQ