許多事物符合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)