您的位置:首页 > 其它

使用libxml2实现简单合并两个不同的xml文件

2012-07-08 16:37 1141 查看
读取两个不同的xml文件,然后从一个xml文件上获取一个节点,让它脱离原来的xml文件,接着将它驳接到另外一个xml文件上去。

       可能会遇到的问题:驳接之后,如果对刚驳接进去的节点执行脱离+删除操作的话,会出现莫名的内存出错信息。然而未驳接过的节点直接删除是没问题的。就大概知道为什么会出错了。大概原因是xml文件的节点存储跟xmlDoc有关,如字典缓冲等,就如libxml(http://blog.csdn.net/shanzhizi)的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

     */

说明节点保存的内容不一定只限定存储在一个节点上,可能跟其他有关,关于该问题的详细描述请参考:http://blog.csdn.net/shanzhizi/article/details/7726743

然后如果对每个xmlDoc读取的时候限制为XML_PARSE_NOBLANKS | XML_PARSE_NODICT,而且两个xmlDoc保证都是这样,即可实现xml文件的简单合并。如果下面的代码去掉这两个限制的话,立刻会在释放的时候出现错误。

合并的代码如下:

#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格式的节点字符串合并到一个xml文件中的根节点下的例子,下面这个程序编译通过可以正常使用。

int LinkXmlNodes(const char *pXMLFilePath)
{
xmlDocPtr doc; //定义解析文档指针
xmlDocPtr doc2;
xmlNodePtr curNode; //定义结点指针(你需要它为了在各个结点间移动)
xmlNodePtr curNode2;
const char *szDocName = pXMLFilePath;
char sXmlString[]="<igmp><status>1</status><group><id>1</id></group></igmp>";

//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;
}

来自:http://blog.csdn.net/shanzhizi
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  xml null file 存储
相关文章推荐