本文共 2432 字,大约阅读时间需要 8 分钟。
读取两个不同的xml文件,然后从一个xml文件上获取一个节点,让它脱离原来的xml文件,接着将它驳接到另外一个xml文件上去。
可能会遇到的问题:驳接之后,如果对刚驳接进去的节点执行脱离+删除操作的话,会出现莫名的内存出错信息。然而未驳接过的节点直接删除是没问题的。就大概知道为什么会出错了。大概原因是xml文件的节点存储跟xmlDoc有关,如字典缓冲等,就如libxml()的xmlFreeNode函数的里面的注释: /* * When a node is a text node or a comment, it uses a global static * variable for the name of the node. * Otherwise the node name might come from the document's dictionnary */ 说明节点保存的内容不一定只限定存储在一个节点上,可能跟其他有关,关于该问题的详细描述请参考:。 然后如果对每个xmlDoc读取的时候限制为XML_PARSE_NOBLANKS | XML_PARSE_NODICT,而且两个xmlDoc保证都是这样,即可实现文件的简单合并。如果下面的代码去掉这两个限制的话,立刻会在释放的时候出现错误。 合并的代码如下: #include <stdio.h> #include <stdlib.h> #include <libxml/xmlmemory.h> #include <libxml/parser.h> int main(void) { xmlDoc *doc = NULL; char *fileName = "test1.xml"; /*parse the file and get the DOM */ doc = xmlReadFile(fileName, NULL, XML_PARSE_NOBLANKS | XML_PARSE_NODICT); if (doc == NULL) { printf("error: could not parse file %s", fileName); return -1; } xmlDoc *doc2 = xmlReadFile(“test2.xml", NULL, XML_PARSE_NOBLANKS | XML_PARSE_NODICT); xmlNodePtr second = xmlDocGetRootElement(doc2)->children; xmlUnlinkNode(second); xmlNodePtr root = xmlDocGetRootElement(doc); xmlAddChild(root, second); //xmlUnlinkNode(second); xmlFreeNode(second); xmlFreeDoc(doc); xmlFreeDoc(doc2);}
上面这个程序没有保存,所以其实什么也没有做。
下面提供一个将一个格式的节点字符串合并到一个xml文件中的根节点下的例子,下面这个程序编译通过可以正常使用。
int LinkXmlNodes(const char *pXMLFilePath){ xmlDocPtr doc; //定义解析文档指针 xmlDocPtr doc2; xmlNodePtr curNode; //定义结点指针(你需要它为了在各个结点间移动) xmlNodePtr curNode2; const char *szDocName = pXMLFilePath; char sXmlString[]=""; //szDocName = pXMLFilePath; doc = xmlReadFile(szDocName,"GB2312",XML_PARSE_NOBLANKS | XML_PARSE_NODICT); //解析文件 if (NULL == doc){ fprintf(stderr,"Document not parsed successfully. \n"); return -1; } curNode = xmlDocGetRootElement(doc); if (NULL == curNode){ fprintf(stderr,"empty document\n"); xmlFreeDoc(doc); return -1; } doc2 =xmlReadMemory( sXmlString, strlen(sXmlString), "noname.xml","GB2312",XML_PARSE_NOBLANKS | XML_PARSE_NODICT); if (NULL == doc2){ fprintf(stderr,"Document not parsed successfully. \n"); return -1; } curNode2 = xmlDocGetRootElement(doc2); if (NULL == curNode2){ fprintf(stderr,"empty document\n"); xmlFreeDoc(doc2); return -1; } xmlUnlinkNode(curNode2); xmlAddChild(curNode,curNode2); xmlSaveFormatFileEnc(szDocName, doc,"GB2312",1); xmlFreeDoc(doc); xmlFreeDoc(doc2); return 0;} 1 1
来自:
转载地址:http://epoci.baihongyu.com/