Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1775990
  • 博文数量: 198
  • 博客积分: 4088
  • 博客等级: 上校
  • 技术积分: 2391
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-15 16:29
个人简介

游戏开发,系统架构; 博客迁移到:http://www.jianshu.com/u/3ac0504b3b8c

文章分类

全部博文(198)

文章存档

2017年(1)

2016年(12)

2015年(1)

2014年(3)

2013年(13)

2012年(18)

2011年(150)

分类: LINUX

2011-08-29 12:59:14

作者:朱金灿
来源:http://blog.csdn.net/clever101


    在《TinyXml 快速入门(二) 》介绍使用tinyxml库获取xml文件声明,查询指定节点、删除指定节点的做法。在本文中继续介绍修改指定节点和增加节点的做法。


     修改节点其实和查询指定节点的值有点类似,也分为两个函数,一个实现修改文本。另一个负责修改属性。

 

  1. /*! 
  2. *  /brief 修改指定节点的文本。 
  3. * 
  4. *  /param XmlFile xml文件全路径。 
  5. *  /param strNodeName 指定的节点名。 
  6. *  /param strText 重新设定的文本的值 
  7. *  /return 是否成功。true为成功,false表示失败。 
  8. */  
  9. bool ModifyNode_Text(std::string XmlFile,std::string strNodeName,std::string strText)  
  10. {  
  11.     // 定义一个TiXmlDocument类指针   
  12.     TiXmlDocument *pDoc = new TiXmlDocument();  
  13.     if (NULL==pDoc)  
  14.     {  
  15.         return false;  
  16.     }  
  17.     pDoc->LoadFile(XmlFile);  
  18.     TiXmlElement *pRootEle = pDoc->RootElement();  
  19.     if (NULL==pRootEle)  
  20.     {  
  21.         return false;  
  22.     }  
  23.     TiXmlElement *pNode = NULL;  
  24.     GetNodePointerByName(pRootEle,strNodeName,pNode);  
  25.     if (NULL!=pNode)  
  26.     {  
  27.         pNode->Clear();  // 首先清除所有文本   
  28.         // 然后插入文本,保存文件   
  29.         TiXmlText *pValue = new TiXmlText(strText);  
  30.         pNode->LinkEndChild(pValue);  
  31.         pDoc->SaveFile(XmlFile);  
  32.         return true;  
  33.     }  
  34.     else  
  35.         return false;  
  36. }  
  37. /*! 
  38. *  /brief 修改指定节点的属性值。 
  39. * 
  40. *  /param XmlFile xml文件全路径。 
  41. *  /param strNodeName 指定的节点名。 
  42. *  /param AttMap 重新设定的属性值,这是一个map,前一个为属性名,后一个为属性值 
  43. *  /return 是否成功。true为成功,false表示失败。 
  44. */  
  45. bool ModifyNode_Attribute(std::string XmlFile,std::string strNodeName,  
  46.                  std::map &AttMap)  
  47. {  
  48.     typedef std::pair  String_Pair;  
  49.     // 定义一个TiXmlDocument类指针   
  50.     TiXmlDocument *pDoc = new TiXmlDocument();  
  51.     if (NULL==pDoc)  
  52.     {  
  53.         return false;  
  54.     }  
  55.     pDoc->LoadFile(XmlFile);  
  56.     TiXmlElement *pRootEle = pDoc->RootElement();  
  57.     if (NULL==pRootEle)  
  58.     {  
  59.         return false;  
  60.     }  
  61.    
  62.     TiXmlElement *pNode = NULL;  
  63.     GetNodePointerByName(pRootEle,strNodeName,pNode);  
  64.     if (NULL!=pNode)  
  65.     {  
  66.         TiXmlAttribute* pAttr = NULL;   
  67.         std::string strAttName = _T("");  
  68.         std::string strAttValue = _T("");  
  69.         for (pAttr = pNode->FirstAttribute(); pAttr; pAttr = pAttr->Next())    
  70.         {    
  71.             strAttName = pAttr->Name();  
  72.             std::map::iterator iter;  
  73.             for (iter=AttMap.begin();iter!=AttMap.end();iter++)  
  74.             {  
  75.                 if (strAttName==iter->first)  
  76.                 {  
  77.                     pAttr->SetValue(iter->second);  
  78.                 }  
  79.             }  
  80.         }    
  81.         pDoc->SaveFile(XmlFile);  
  82.         return true;  
  83.     }  
  84.     else  
  85.     {  
  86.         return false;  
  87.     }  
  88. }  


     对于ModifyNode_Attribute函数,这里稍微介绍一下如何使用,比如对于下面这样一个xml文件:

  1. xml version="1.0" encoding="utf-8" standalone="yes" ?>  
  2. <MyApp>  
  3.     <Messages>  
  4.         <Welcome>Welcome to MyAppWelcome>  
  5.         <Farewell>Thank you for using MyAppFarewell>  
  6.     Messages>  
  7.     <Windows>  
  8.         <Window name="MainFrame" x="5" y="15" w="400" h="250" />  
  9.     Windows>  
  10.     <Connection ip="192.168.0.1" timeout="123.456000" />  
  11. MyApp>  


     我们如果要修改节点的Connection的ip为192.168.0.100,timeout为1000,我们可以这样用:

  1. std::string XmlFile = _T("E://TestTinyxml//example4.xml");  
  2.     std::string strNodeName = _T("Connection");  
  3.    typedef std::pair  String_Pair;  
  4.    std::map AttMap;  
  5.    AttMap.insert(String_Pair(_T("ip"),_T("192.168.0.100")));  
  6.    AttMap.insert(String_Pair(_T("timeout"),_T("1000")));  
  7.    ModifyNode_Attribute(XmlFile,strNodeName,AttMap);  

     下面是增加节点的两个函数:

  1. /*! 
  2. *  /brief 增加指定节点的文本。 
  3. * 
  4. *  /param XmlFile xml文件全路径。 
  5. *  /param strParNodeName 要增加的节点的父节点。 
  6. *  /param strNodeName 指定的节点名。 
  7. *  /param strText 要增加的文本 
  8. *  /return 是否成功。true为成功,false表示失败。 
  9. */  
  10. bool AddNode_Text(std::string XmlFile,std::string strParNodeName,std::string strNodeName,
  11. std::string strText)  
  12. {  
  13.     // 定义一个TiXmlDocument类指针   
  14.     TiXmlDocument *pDoc = new TiXmlDocument();  
  15.     if (NULL==pDoc)  
  16.     {  
  17.         return false;  
  18.     }  
  19.     pDoc->LoadFile(XmlFile);  
  20.     TiXmlElement *pRootEle = pDoc->RootElement();  
  21.     if (NULL==pRootEle)  
  22.     {  
  23.         return false;  
  24.     }  
  25.     TiXmlElement *pNode = NULL;  
  26.     GetNodePointerByName(pRootEle,strParNodeName,pNode);  
  27.     if (NULL!=pNode)  
  28.     {  
  29.         // 生成子节点:pNewNode   
  30.         TiXmlElement *pNewNode = new TiXmlElement(strNodeName);  
  31.         if (NULL==pNewNode)  
  32.         {  
  33.             return false;  
  34.         }  
  35.         // 设置节点文本,然后插入节点   
  36.         TiXmlText *pNewValue = new TiXmlText(strText);  
  37.         pNewNode->LinkEndChild(pNewValue);  
  38.         pNode->InsertEndChild(*pNewNode);  
  39.         pDoc->SaveFile(XmlFile);  
  40.         return true;  
  41.     }  
  42.     else  
  43.          return false;  
  44.       
  45. }  
  46. /*! 
  47. *  /brief 增加节点。 
  48. * 
  49. *  /param XmlFile xml文件全路径。 
  50. *  /param strParNodeName 要增加的节点的父节点。 
  51. *  /param strNodeName 指定的节点名。 
  52. *  /param AttMap 要增加的节点设定的属性值,这是一个map,前一个为属性名,后一个为属性值 
  53. *  /return 是否成功。true为成功,false表示失败。 
  54. */  
  55. bool AddNode_Attribute(std::string XmlFile,std::string strParNodeName,std::string strNodeName,
  56. std::map &AttMap)  
  57. {  
  58.     // 定义一个TiXmlDocument类指针   
  59.     TiXmlDocument *pDoc = new TiXmlDocument();  
  60.     if (NULL==pDoc)  
  61.     {  
  62.         return false;  
  63.     }  
  64.     pDoc->LoadFile(XmlFile);  
  65.     TiXmlElement *pRootEle = pDoc->RootElement();  
  66.     if (NULL==pRootEle)  
  67.     {  
  68.         return false;  
  69.     }  
  70.     TiXmlElement *pNode = NULL;  
  71.     GetNodePointerByName(pRootEle,strParNodeName,pNode);  
  72.     if (NULL!=pNode)  
  73.     {  
  74.         // 生成子节点:pNewNode   
  75.         TiXmlElement *pNewNode = new TiXmlElement(strNodeName);  
  76.         if (NULL==pNewNode)  
  77.         {  
  78.             return false;  
  79.         }  
  80.         // 设置节点的属性值,然后插入节点   
  81.         std::map::iterator iter;  
  82.         for (iter=AttMap.begin();iter!=AttMap.end();iter++)  
  83.         {  
  84.              pNewNode->SetAttribute(iter->first,iter->second);  
  85.         }  
  86.         pNode->InsertEndChild(*pNewNode);  
  87.         pDoc->SaveFile(XmlFile);  
  88.         return true;  
  89.     }  
  90.     else  
  91.         return false;  
  92. }  
阅读(1358) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~