您的位置:首页 > 其它

libxml2实现xml文档的节点的修改

2011-12-30 14:41 761 查看
 其实在网上很容易能找到使用libxml2来对xml文档进行创建、解析、修改等。我着这里主要是就自己学习的libxml2修改xml文档的节点进行一个简单的总结,方便自己以后回顾。
 

下面给出我写的一个例子:

/**********************************************************************

Copyright, 2011, **** Tech. Co., Ltd.

All Rights Reserved

-----------------------------------------------------------------------

Project Code   : wlan

File name      : modify_node.cpp

Author         : Sky_qing

Description    : 使用libxml2修改xml文档的节点

Function List:

-----------------------------------------------------------------------

History:

Date            Author                 Modification

2011-12-27     Sky_qing                created file

**********************************************************************/
#include <stdio.h>
#include "libxml/parser.h"
#include "libxml/tree.h"

int main(int argc, char* argv[])
{
xmlDocPtr doc;				//定义解析文档指针
xmlNodePtr curNode;			//定义节点指针(在各个节点之间移动)
char* szDocName = argv[1];	//保存xml文档名,该文档名在运行程序到时候输入。
//例如:编译格式为g++ modify_node.cpp -o modify_node -I /usr/local/include/libxml2/  -L /usr/local/lib -lxml2,生成可执行文件modify_node,运行时:./modify_node log4crc(此处log4crc为要修改的xml文档)

printf("........start........\n");
doc = xmlReadFile(szDocName, "utf-8", XML_PARSE_RECOVER); 	//解析文档
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;
}

if (xmlStrcmp(curNode->name, (const xmlChar*)"log4c"))	//确认根元素是否为“log4c”
{
fprintf(stderr, "Document of wrong type. root node != log4c");
xmlFreeDoc(doc);

return -1;
}

curNode = curNode->xmlChildrenNode;
xmlNodePtr propNode = curNode;
while (NULL != curNode)		//遍历所有节点
{
//获取名称为category的节点
if (!xmlStrcmp(curNode->name, (const xmlChar*)"category"))
{
//查找带有属性name的节点
if (xmlHasProp(curNode, BAD_CAST "name"))
{
propNode = curNode;
}

//查找属性name为WLAN_Console的节点
xmlAttrPtr attrPtr = propNode->properties;
while (NULL != attrPtr)		//遍历所有名称为category的节点
{
if (!xmlStrcmp(attrPtr->name, (const xmlChar*)"name"))	//找到有name属性到节点
{
//查找属性为name的值的节点
xmlChar* szPropity = xmlGetProp(propNode, (const xmlChar*)"name");
if (!xmlStrcmp((const xmlChar*)szPropity, (const xmlChar*)"WLAN_Console"))
{
xmlAttrPtr setAttrPtr = propNode->properties;
while (NULL != setAttrPtr)
{
//设置属性priority的值
xmlSetProp(propNode, (const xmlChar*)"priority", (const xmlChar*)"debug");

setAttrPtr = setAttrPtr->next;
}
}
}
attrPtr = attrPtr->next;
}
}
curNode = curNode->next;
}

//保存文档到原文档中
xmlSaveFile("log4crc", doc);

printf("...........OK............\n");

return 0;
}


编译和运行格式在代码中有。

 

参考文章:

http://blog.sina.com.cn/s/blog_669e9f6a0100sbql.html

http://wenku.baidu.com/view/02d0fdea172ded630b1cb61c.html

博主所有文章已转自私人博客Joe
的个人博客,谢谢关注!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  文档 xml null file function
相关文章推荐