转自:http://blog.csdn.net/sky_qing/article/details/7165010
http://blog.chinaunix.net/uid-20680966-id-3475787.html
======================================================================
其实在网上很容易能找到使用libxml2来对xml文档进行创建、解析、修改等。我着这里主要是就自己学习的libxml2修改xml文档的节点进行一个简单的总结,方便自己以后回顾。
下面给出我写的一个例子:
- /**********************************************************************
- Copyright,2011,****Tech.Co.,Ltd.
- AllRightsReserved
- -----------------------------------------------------------------------
- ProjectCode:wlan
- Filename:modify_node.cpp
- Author:Sky_qing
- Description:使用libxml2修改xml文档的节点
- FunctionList:
- History:
- DateAuthorModification
- 2011-12-27Sky_qingcreatedfile
- **********************************************************************/
- #include<stdio.h>
- #include"libxml/parser.h"
- #include"libxml/tree.h"
- intmain(intargc,char*argv[])
- {
- xmlDocPtrdoc;//定义解析文档指针
- xmlNodePtrcurNode;//定义节点指针(在各个节点之间移动)
- char*szDocName=argv[1];//保存xml文档名,该文档名在运行程序到时候输入。
- //例如:编译格式为g++modify_node.cpp-omodify_node-I/usr/local/include/libxml2/-L/usr/local/lib-lxml2,生成可执行文件modify_node,运行时:./modify_nodelog4crc(此处log4crc为要修改的xml文档)
- printf("........start........\n");
- doc=xmlReadFile(szDocName,"utf-8",XML_PARSE_RECOVER);//解析文档
- if(NULL==doc)
- {
- fprintf(stderr,0); background-color:inherit">"Documentnotparsedsuccessfully.\n");
- return-1;
- }
- curNode=xmlDocGetRootElement(doc);//确定文档根元素
- if(NULL==curNode)
- "EmptyDocument.\n");
- xmlFreeDoc(doc);//释放文件
- return-1;
- }
- if(xmlStrcmp(curNode->name,(constxmlChar*)"log4c"))//确认根元素是否为“log4c”
- "Documentofwrongtype.rootnode!=log4c");
- xmlFreeDoc(doc);
- curNode=curNode->xmlChildrenNode;
- xmlNodePtrpropNode=curNode;
- while(NULL!=curNode)//遍历所有节点
- //获取名称为category的节点
- if(!xmlStrcmp(curNode->name,0); background-color:inherit">"category"))
- //查找带有属性name的节点
- if(xmlHasProp(curNode,BAD_CAST"name"))
- propNode=curNode;
- //查找属性name为WLAN_Console的节点
- xmlAttrPtrattrPtr=propNode->properties;
- while(NULL!=attrPtr)//遍历所有名称为category的节点
- if(!xmlStrcmp(attrPtr->name,0); background-color:inherit">"name"))//找到有name属性到节点
- //查找属性为name的值的节点
- xmlChar*szPropity=xmlGetProp(propNode,("name");
- if(!xmlStrcmp((constxmlChar*)szPropity,0); background-color:inherit">"WLAN_Console"))
- xmlAttrPtrsetAttrPtr=propNode->properties;
- while(NULL!=setAttrPtr)
- //设置属性priority的值
- xmlSetProp(propNode,0); background-color:inherit">"priority",0); background-color:inherit">"debug");
- setAttrPtr=setAttrPtr->next;
- attrPtr=attrPtr->next;
- curNode=curNode->next;
- //保存文档到原文档中
- xmlSaveFile("log4crc",doc);
- "...........OK............\n");
- return0;
- }
- staticxmlXPathObjectPtrgetNodeset(xmlDocPtrdoc,constxmlChar*xpath)
- {
- xmlXPathContextPtrcontext;
- xmlXPathObjectPtrresult;
- context=xmlXPathNewContext(doc);
- if(context==NULL){
- printf("contextisNULL\n");
- returnNULL;
- }
- result=xmlXPathEvalExpression(xpath,context);
- xmlXPathFreeContext(context);
- if(result==NULL){
- printf("xmlXPathEvalExpressionreturnNULL\n");
- returnNULL;
- }
- if(xmlXPathNodeSetIsEmpty(result->nodesetval)){
- xmlXPathFreeObject(result);
- printf("nodesetisempty\n");
- returnresult;
- }
playlistDoc 为 xmlDocPtr类型.
copy