libxml庫之xmlParseMemory和xmlDocDumpFormatMemory函數 .

轉自: http://blog.csdn.net/iamlate/article/details/6955698

 

兩個函數,怎麼在內存中處理xml文件。有個疑問,xmlChar *xmlbuff;這樣系統第一次分配了xmlbuff的大小以後。對xml做修改,可以成功嗎。

有空試試。


函數原型:

  1. xmlParseMemory  
  2.   
  3. xmlDocPtr   xmlParseMemory      (const char * buffer,   
  4.                      int size)  
  5.   
  6. parse an XML in-memory block and build a tree.  
  7.   
  8. buffer: an pointer to a char array  
  9. size:   the size of the array  
  10. Returns:    the resulting document tree  
  11. Function: xmlParserAddNodeIn  
xmlParseMemory

xmlDocPtr	xmlParseMemory		(const char * buffer, 
					 int size)

parse an XML in-memory block and build a tree.

buffer:	an pointer to a char array
size:	the size of the array
Returns:	the resulting document tree
Function: xmlParserAddNodeIn


代碼示例:
  1.  解析xml字符串  
  2. xmlDocPtr doc = xmlParseMemory(pXml, length);  
  3.    
  4. //根據xmldoc獲得xml的根節點   
  5. xmlNodePtr cur = xmlDocGetRootElement(doc);  
  6.    
  7. //獲得子節點:->children獲得不是第一個子節點,必須用next才能獲得第一個子節點   
  8. cur = cur->children;  
  9. cur = cur->next;  
  10.   
  11. // 獲得節點信息中的內容: 注意釋放資源   
  12. xmlChar* key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);  
  13. xmlFree(key);  
  14.   
  15. //獲得節點信息屬性的值:屬性name,注意釋放資源   
  16. xmlChar* fversion = xmlGetProp(cur, "version");  
  17. xmlFree(fversion);  
  18.   
  19.   
  20.   
  21. //根節點相關函數   
  22. xmlNodePtr xmlDocGetRootElement (xmlDocPtr doc) //獲取文檔根節點   
  23. xmlNodePtr xmlDocSetRootElement (xmlDocPtr doc, xmlNodePtr root) //設置文檔根節點   
  24.   
  25. //創建子節點相關函數   
  26. xmlNodePtr xmlNewNode (xmlNsPtr ns, const xmlChar * name) //創建新節點   
  27. xmlNodePtr xmlNewChild (xmlNodePtr parent, xmlNsPtr ns, const xmlChar * name, const xmlChar * content) //創建新的子節點   
  28. xmlNodePtr xmlCopyNode (const xmlNodePtr node, int extended) //複製當前節點   
  29.   
  30. //添加子節點相關函數   
  31. xmlNodePtr xmlAddChild (xmlNodePtr parent, xmlNodePtr cur) //給指定節點添加子節點   
  32. xmlNodePtr xmlAddNextSibling (xmlNodePtr cur, xmlNodePtr elem) //添加後一個兄弟節點   
  33. xmlNodePtr xmlAddPrevSibling (xmlNodePtr cur, xmlNodePtr elem) //添加前一個兄弟節點   
  34. xmlNodePtr xmlAddSibling (xmlNodePtr cur, xmlNodePtr elem) //添加兄弟節點   
  35.   
  36. //屬性相關函數   
  37. xmlAttrPtr    xmlNewProp (xmlNodePtr node, const xmlChar * name, const xmlChar * value) //創建新節點屬性   
  38. xmlChar *    xmlGetProp (xmlNodePtr node, const xmlChar * name) //讀取節點屬性   
  39. xmlAttrPtr    xmlSetProp (xmlNodePtr node, const xmlChar * name, const xmlChar * value) //設置節點屬性   
  40.   
  41. =xmlNodeListGetstring(doc, cur->xmlChildrenNode, 1);  
  42. =xmlNodeContent(cur);  
 解析xml字符串
xmlDocPtr doc = xmlParseMemory(pXml, length);
 
//根據xmldoc獲得xml的根節點
xmlNodePtr cur = xmlDocGetRootElement(doc);
 
//獲得子節點:->children獲得不是第一個子節點,必須用next才能獲得第一個子節點
cur = cur->children;
cur = cur->next;

// 獲得節點信息中的內容: 注意釋放資源
xmlChar* key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
xmlFree(key);

//獲得節點信息屬性的值:屬性name,注意釋放資源
xmlChar* fversion = xmlGetProp(cur, "version");
xmlFree(fversion);



//根節點相關函數
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) //設置節點屬性

=xmlNodeListGetstring(doc, cur->xmlChildrenNode, 1);
=xmlNodeContent(cur);





===========================================================================================

函數原型:

  1. Function: xmlDocDumpFormatMemory  
  2.   
  3. void    xmlDocDumpFormatMemory      (xmlDocPtr cur,   
  4.                      xmlChar ** mem,   
  5.                      int * size,   
  6.                      int format)  
  7.   
  8. Dump an XML document in memory and return the #xmlChar * and it's size. It's up to the caller to free the memory with xmlFree(). Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 or xmlKeepBlanksDefault(0) was called  
  9.   
  10. cur:    the document  
  11. mem:    OUT: the memory pointer  
  12. size:   OUT: the memory length  
  13. format: should formatting spaces been added  
Function: xmlDocDumpFormatMemory

void	xmlDocDumpFormatMemory		(xmlDocPtr cur, 
					 xmlChar ** mem, 
					 int * size, 
					 int format)

Dump an XML document in memory and return the #xmlChar * and it's size. It's up to the caller to free the memory with xmlFree(). Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 or xmlKeepBlanksDefault(0) was called

cur:	the document
mem:	OUT: the memory pointer
size:	OUT: the memory length
format:	should formatting spaces been added

程序示例:

  1. /** 
  2.  * section: InputOutput 
  3.  * synopsis: Output to char buffer 
  4.  * purpose: Demonstrate the use of xmlDocDumpMemory 
  5.  *          to output document to a character buffer 
  6.  * usage: io2 
  7.  * test: io2 > io2.tmp ; diff io2.tmp io2.res ; rm -f io2.tmp 
  8.  * author: John Fleck 
  9.  * copy: see Copyright for the status of this software. 
  10.  */  
  11.   
  12. #include <libxml/parser.h>   
  13.   
  14. #if defined(LIBXML_TREE_ENABLED) && defined(LIBXML_OUTPUT_ENABLED)   
  15. int  
  16. main(void)  
  17. {  
  18.   
  19.     xmlNodePtr n;  
  20.     xmlDocPtr doc;  
  21.     xmlChar *xmlbuff;  
  22.     int buffersize;  
  23.   
  24.     /* 
  25.      * Create the document. 
  26.      */  
  27.     doc = xmlNewDoc(BAD_CAST "1.0");  
  28.     n = xmlNewNode(NULL, BAD_CAST "root");  
  29.     xmlNodeSetContent(n, BAD_CAST "content");  
  30.     xmlDocSetRootElement(doc, n);  
  31.   
  32.     /* 
  33.      * Dump the document to a buffer and print it 
  34.      * for demonstration purposes. 
  35.      */  
  36.     xmlDocDumpFormatMemory(doc, &xmlbuff, &buffersize, 1);  
  37.     printf("%s", (char *) xmlbuff);  
  38.   
  39.     /* 
  40.      * Free associated memory. 
  41.      */  
  42.     xmlFree(xmlbuff);  
  43.     xmlFreeDoc(doc);  
  44.   
  45.     return (0);  
  46.   
  47. }  
  48. #else   
  49. #include <stdio.h>   
  50.   
  51. int  
  52. main(void)  
  53. {  
  54.     fprintf(stderr,  
  55.             "library not configured with tree and output support\n");  
  56.     return (1);  
  57. }  
  58. #endif  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章