两个函数,怎么在内存中处理xml文件。有个疑问,xmlChar *xmlbuff;这样系统第一次分配了xmlbuff的大小以后。对xml做修改,可以成功吗。
有空试试。
函数原型:
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
解析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);
===========================================================================================
函数原型:
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
/** * section: InputOutput * synopsis: Output to char buffer * purpose: Demonstrate the use of xmlDocDumpMemory * to output document to a character buffer * usage: io2 * test: io2 > io2.tmp ; diff io2.tmp io2.res ; rm -f io2.tmp * author: John Fleck * copy: see Copyright for the status of this software. */ #include <libxml/parser.h> #if defined(LIBXML_TREE_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) int main(void) { xmlNodePtr n; xmlDocPtr doc; xmlChar *xmlbuff; int buffersize; /* * Create the document. */ doc = xmlNewDoc(BAD_CAST "1.0"); n = xmlNewNode(NULL, BAD_CAST "root"); xmlNodeSetContent(n, BAD_CAST "content"); xmlDocSetRootElement(doc, n); /* * Dump the document to a buffer and print it * for demonstration purposes. */ xmlDocDumpFormatMemory(doc, &xmlbuff, &buffersize, 1); printf("%s", (char *) xmlbuff); /* * Free associated memory. */ xmlFree(xmlbuff); xmlFreeDoc(doc); return (0); } #else #include <stdio.h> int main(void) { fprintf(stderr, "library not configured with tree and output support\n"); return (1); } #endif
来源:
http://xmlsoft.org/examples/io2.c //libxml官方网站
http://blog.163.com/miky_sun/blog/static/3369405201041942853395/