视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
libxml2实现xml文档的节点的修改
2020-11-09 15:58:43 责编:小采
文档

其实在网上很容易能找到使用libxml2来对xml文档进行创建、解析、修改等。我着这里主要是就自己学习的libxml2修改xml文档的节点进行一个简单的总结,方便自己以后回顾。 下面给出我写的一个例子: /*********************************************************

其实在网上很容易能找到使用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 
#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

下载本文
显示全文
专题