作者:辛愿1346_589 | 来源:互联网 | 2017-05-12 15:45
其实在网上很容易能找到使用libxml2来对xml文档进行创建、解析、修改等。我着这里主要是就自己学习的libxml2修改xml文档的节点进行一个简单的总结,方便自己以后回顾。下面给出我写的一个例子:*********************************************************
其实在网上很容易能找到使用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