分享

TinyXml查找唯一节点及修改节点操作

 Fredanf 2012-12-14

TinyXml查找唯一节点及修改节点操作

分类: C++ 算法 238人阅读 评论(0) 收藏 举报
  1. // 读者对象:对TinyXml有一定了解的人。本文是对TinyXml工具的一些知识点的理解。  
  2. // 1  TinyXml中对TiXmlNode进行了分类,是用一个枚举进行描述的。  
  3. // enum NodeType  
  4. // {  
  5. // DOCUMENT,    文档节点  
  6. // ELEMENT,     元素节点  
  7. // COMMENT,     还没弄清楚  
  8. // UNKNOWN,     未知节点  
  9. // TEXT,        文本节点  
  10. // DECLARATION, 声明节点  
  11. // TYPECOUNT    还没弄清楚  
  12. // };  
  13. // TiXmlNode * pNode->Type() 函数可以返回节点的类型。  
  14. // 枚举的比较方法:TiXmlText::TEXT == pNode->Type();  
  15. //   
  16. // 这几个类型非常重要,尤其是在遍历xml时或者查找一个节点时  
  17. // 我对节点和元素的理解如下:为了说明问题,我使用下面的xml文档来举例说明  
  18. // <?xml version="1.0" encoding="gb2312"?>  
  19. // <Persons>    
  20. //  <person Id="200" Shengao=34 ClassName="计本0508">  
  21. //      <name>vertor</name>  
  22. //      <age>20</age>  
  23. //      <address encode="utf-8">  
  24. //          <country>中国</country>  
  25. //          <province>山西</province>  
  26. //          <village>王大庄</village>  
  27. //      </address>  
  28. //  </person>  
  29. // </Persons>  
  30. //   
  31. // 2.1 节点:一种对文档结构的描述对象  
  32. // 2.2 元素:对文档某一个数据块的描述  
  33. // 2.3 文本是指没有孩子的节点  
  34. //    例如<village>大王庄</village>  文本节点是:"大王庄"   
  35. //    然而判断一个节点是否是文本节点时并不是根据pNode->NoChildren()来判断,而是根据节点的类型来判断  
  36. //    因为如果一个节点形如:<village></village>它也是没有孩子节点的。  
  37. // 2.4 节点类可以转换成元素对象。  
  38. //     例如 TiXmlElement * pElement = pNode->ToElement();  
  39. //     那什么时候需要转换成元素呢?  
  40. //       当你需要元素的一些属性值是就需要转换了。  
  41. // 2.5 元素跟节点都有关于访问孩子的函数,  
  42. // 元素访问孩子的函数:  
  43. //   FirstChildElement() 返回当前元素的孩子元素  
  44. //   NextSiblingElement() 返回当前元素的同级元素  
  45. // 节点访问节点孩子的函数:  
  46. //   FirstChild()       返回当前节点的孩子节点  
  47. //   NextSibing()       返回当前节点的同级下一个节点  
  48. // 个人觉得 元素访问和节点访问在一般的访问下没有区别,两者都可以访问的孩子  
  49. // 对于一些特殊的情况下才需要区分。比如你要访问属性时,就需要用元素来找到第一个属性值。  
  50. // 2.6 对于遍历一个xml文档时,思路一般是这样的:  
  51. //   1 载入一个xml  
  52. //   2 获得根元素(不是根节点)  
  53. //   3 循环访问每一个根元素的子元素  
  54. //   4 对每一个子元素进行解析。  
  55. //  4.1 获取子元素的类型Type  
  56. //  4.2 switch(Type)  
  57. //      case TEXT:  
  58. //      输出文本节点的值pNode->value()  
  59. //      case ELEMENT:  
  60. //          获取元素的value(这里的value指的是元素的名字,例如:person元素)  
  61. //      循环获取元素的每一个属性  
  62. //          a 得到元素的第一个属性  
  63. //          b do——while循环获取每一个属性和值。  
  64. //      case COMMENT: 暂时不用管  
  65. //      case UNKNOWN: 暂时不用管  
  66. //      case DECLARATION:   
  67. //           获取元素的版本,编码方式等等  
  68. //  4.3 循环遍历子元素的下一级元素(即孙子元素) 在这里也可以遍历孙子节点。  
  69. //      递归调用第四步。  
  70. // 基本思路就是这样,具体代码见后面  
  71. // 2.7 如果定位一个节点  
  72. //   唯一确定一个节点的方法是根据节点名,属性名,属性值  
  73. //   1 根据xml的遍历思想找到与给定节点名一样的节点  
  74. //   2 如果这个节点有属性并且属性名和值与给定的一致,说明找到了。  
  75. //   3 如果没有一致的,说明解析失败。  
  76. //   4 如果没有给定属性名和值,则可以默认只查找与节点名一致的节点。  
  77. // 2.8 编码问题  
  78. //   用TinyXml加载一个xml文档时,根据文档的编码方式来加载,在操作过程中需要进行编码转换  
  79. //   如果encoding=utf-8 则在遍历时,需要进行编码转换,具体转换还没找到方法。  
  80. //   
  81. // 2.9 指针的 new和释放。  
  82. //    TinyXml已经帮我们把指针分配的内存进行了管理,在析构函数中进行了处理,我们不需要处理new出来的指针  
  83. //    如果我们显示的delete时,有可能影响程序运行。  
  84. // 3.0 对于添加一个节点,删除一个节点,更新一个节点时,都需要在最后SaveFile,我就好几次忘了SaveFile,所以调了老半天。  
  85. // 3.1 总的来说,Tinyxml还是不错的,以后继续学习。  
  86. // 部分功能代码  
  87. // 3.2 对于插入一个节点,首先获取要插入节点的父节点,然后进行插入,最需要注意的是在查询父节点的是时候,必须对应同一个文本对象来操作。有可能在两个函数中同时打开了同一个xml文档,虽然名字一样,但是不是同一个xmldocument对象,所以操作会失败。  
  88. // 最后要保存。  
  89.   
  90. #include "XmlTest.h"  
  91.   
  92. #define MAX_NUM 256  
  93.   
  94. /************************************************************************/  
  95. /*  创建一个xml文档                                                                    */  
  96. /************************************************************************/  
  97. void createXml(const char * ccXmlName)  
  98. {  
  99.       
  100.     //创建一个XML的文档对象。  
  101.     TiXmlDocument *myDocument = new TiXmlDocument();  
  102.     TiXmlDeclaration* decl = new TiXmlDeclaration("1.0","gb2312","yes");  
  103.     myDocument->LinkEndChild(decl);  
  104.   
  105.     //创建一个根元素并连接。  
  106.     TiXmlElement *RootElement = new TiXmlElement("Persons");  
  107.     myDocument->LinkEndChild(RootElement);  
  108.       
  109.     for(int i=0; i<10;i++)  
  110.     {  
  111.         //创建一个Person元素并连接。  
  112.         TiXmlElement *PersonElement = new TiXmlElement("Person");  
  113.         RootElement->LinkEndChild(PersonElement);  
  114.           
  115.         //设置Person元素的属性。  
  116.         PersonElement->SetAttribute("ID", i);  
  117.           
  118.         //创建name元素、age元素并连接。  
  119.         TiXmlElement *NameElement = new TiXmlElement("name");  
  120.         TiXmlElement *AgeElement = new TiXmlElement("age");  
  121.         PersonElement->LinkEndChild(NameElement);  
  122.         PersonElement->LinkEndChild(AgeElement);  
  123.           
  124.         //设置name元素和age元素的内容并连接。  
  125.         TiXmlText *NameContent = new TiXmlText("周星星");  
  126.         TiXmlText *AgeContent = new TiXmlText("20");  
  127.         NameElement->LinkEndChild(NameContent);  
  128.         AgeElement->LinkEndChild(AgeContent);  
  129.   
  130.     }  
  131.   
  132.     //保存到文件  
  133.      myDocument->SaveFile(ccXmlName);  
  134. }  
  135.   
  136. /************************************************************************/  
  137. /*  遍历一个xml文档                                                                   */  
  138. /************************************************************************/  
  139. void readXml(const char * ccXmlName)  
  140. {  
  141.     //创建一个XML的文档对象。  
  142.     TiXmlDocument *myDocument = new TiXmlDocument(ccXmlName);  
  143.     myDocument->LoadFile();  
  144.   
  145.     //获得xml的头,即声明部分  
  146.     TiXmlDeclaration* decl = myDocument->FirstChild()->ToDeclaration();  
  147.     cout << "xml文件的版本是:" << decl->Version() << endl;  
  148.     cout << "xml的编码格式是:" << decl->Encoding() << endl;  
  149.   
  150.     //获得根元素  
  151.     TiXmlElement *RootElement = myDocument->RootElement();  
  152.   
  153.     //输出根元素名称  
  154.     cout << RootElement->Value() << endl;  
  155.   
  156.     TiXmlNode* pNode  = NULL;  
  157.     string msg = "";  
  158.   
  159.     for(pNode=RootElement->FirstChildElement();pNode;pNode=pNode->NextSiblingElement())  
  160.     {  
  161.         msg += dumpNode(pNode,0);  
  162.     }  
  163.   
  164.     cout << msg << endl;  
  165. }  
  166.   
  167.   
  168. /************************************************************************/  
  169. /*描述:遍历一个元素 
  170.   时间:2012-9-18 
  171.   参数说明:pNode节点,flag 节点嵌套层数 
  172. /************************************************************************/  
  173. string dumpNode(TiXmlNode * pNode,int flag)  
  174. {     
  175.     string msg = "";  
  176.       
  177.     if(pNode == NULL)  
  178.     {  
  179.         return "";  
  180.     }  
  181.   
  182.     TiXmlText * pText = NULL;  
  183.     TiXmlNode * pChildNode = NULL;  
  184.     int t = pNode->Type();  
  185.       
  186.     switch(t)  
  187.     {  
  188.         //节点类型是text节点  
  189.         case TiXmlText::TINYXML_TEXT:  
  190.         {   pText = pNode->ToText();  
  191.             string text = pText->Value();  
  192.             if(!text.empty())  
  193.             {  
  194.                 msg = msg + "="+ text;  
  195.             }  
  196.             break;  
  197.         }  
  198.   
  199.         //节点类型是Element  
  200.         case TiXmlText::TINYXML_ELEMENT:  
  201.         {  
  202.             msg = msg + "\r\n";  
  203.             int num = flag;  
  204.               
  205.             while(num >= 1)  
  206.             {  
  207.                 msg = msg + "  ";  
  208.                 num--;  
  209.             }  
  210.               
  211.             msg = msg + pNode->Value();  
  212.               
  213.             //输出属性  
  214.             TiXmlElement * pElement = pNode->ToElement();  
  215.               
  216.             TiXmlAttribute * pAttr = pElement->FirstAttribute();  
  217.             TiXmlAttribute * pNextAttr =NULL;  
  218.             string tmpAttrMsg = "[";  
  219.               
  220.             //if(pAttr != NULL && !(string(pAttr->Name())).compare("name") && !(string(pAttr->Value())).compare("IDH_CFG_USB"))  
  221.             if(pAttr != NULL )  
  222.             {     
  223.                 string tmpAttrVal = "";  
  224.                 string tmpAttrName = "";          
  225.                   
  226.                 do  
  227.                 {                             
  228.                     tmpAttrVal = pAttr->Value();  
  229.                     tmpAttrName = pAttr->Name();  
  230.                     tmpAttrMsg += tmpAttrName + "=" +tmpAttrVal + ",";  //各个属性之间用逗号分隔  
  231.                 }while(pAttr = pAttr->Next());  
  232.                   
  233.                 /* 去掉最后的',' */  
  234.                 tmpAttrMsg = tmpAttrMsg.erase(tmpAttrMsg.find_last_of(","));  
  235.                 //同上 tmpAttrMsg = tmpAttrMsg.substr(0,tmpAttrMsg.find_last_of(","));  
  236.                   
  237.             }  
  238.             tmpAttrMsg += "]";  
  239.             msg += tmpAttrMsg;  
  240.   
  241.             break;  
  242.         }  
  243.   
  244.         case TiXmlText::TINYXML_DOCUMENT:  
  245.         case TiXmlText::TINYXML_COMMENT:  
  246.         case TiXmlText::TINYXML_UNKNOWN:  
  247.         case TiXmlText::TINYXML_DECLARATION:  
  248.         case TiXmlText::TINYXML_TYPECOUNT:  
  249.         {  
  250.             ;//Nothing to do  
  251.         }  
  252.     }  
  253.       
  254.     //循环访问它的每一个元素  
  255.     for(pChildNode=pNode->FirstChild();pChildNode!=0;pChildNode = pChildNode->NextSibling())  
  256.     {  
  257.           
  258.         msg = msg + dumpNode(pChildNode,flag+1);  
  259.   
  260.     }  
  261.   
  262.     return msg;  
  263. }  
  264.   
  265.   
  266. /************************************************************************/  
  267. /* 查询出唯一节点                                                         */  
  268. /* 参数说明: 
  269.    string nodeName    节点名 
  270.    string nodeAttrName 节点的属性 
  271.    string nodeAttrValue 节点属性的值 
  272. /************************************************************************/  
  273. TiXmlNode * SelectSingleNode(const char * cXmlName,string nodeName,string nodeAttrName,string nodeAttrValue)  
  274. {  
  275.     //加载一个XML的文档对象。  
  276.   
  277.     TiXmlDocument *xmlDoc = new TiXmlDocument(cXmlName);  
  278.     if(!xmlDoc->LoadFile())  //是tinyXml会自动处理文档的BOM  
  279.     {  
  280.         return NULL;  
  281.     }  
  282.   
  283.   
  284.     if(xmlDoc == NULL)  
  285.     {  
  286.         return NULL;  
  287.     }  
  288.   
  289.     //获得根元素  
  290.     TiXmlElement *RootElement = xmlDoc->RootElement();  
  291.     if(RootElement == NULL)  
  292.     {  
  293.         cout << "解析错误,无法获取根元素" << endl;  
  294.         return NULL;  
  295.     }  
  296.   
  297.     TiXmlNode * pNode  = NULL;  
  298.     TiXmlNode * pSelectNode = NULL;  
  299.     string msg = "";  
  300.   
  301.     for(pNode=RootElement->FirstChildElement();pNode;pNode=pNode->NextSiblingElement())  
  302.     {  
  303.           
  304.         pSelectNode = selectChildNode(pNode,nodeName,nodeAttrName,nodeAttrValue);  
  305.         if(pSelectNode)  
  306.         {  
  307.             break;  
  308.         }  
  309.     }  
  310.       
  311.     if(pSelectNode)  
  312.     {  
  313.         cout << "解析成功" << endl;  
  314.         cout << "[节点名]=" << pSelectNode->Value() << endl;  
  315.         return pSelectNode;  
  316.     }  
  317.     else  
  318.     {  
  319.         cout << "解析错误,无法获取节点" << endl;  
  320.         return NULL;  
  321.     }  
  322.   
  323. }  
  324.   
  325.   
  326. TiXmlNode * SelectSingleNodeByRootEle(TiXmlElement* RootElement,string nodeName,string nodeAttrName,string nodeAttrValue)  
  327. {  
  328.     //加载一个XML的文档对象。  
  329.       
  330. //  TiXmlDocument *xmlDoc = new TiXmlDocument(cXmlName);  
  331. //  if(!xmlDoc->LoadFile())  //是tinyXml会自动处理文档的BOM  
  332. //  {  
  333. //      return NULL;  
  334. //  }  
  335. //    
  336. //    
  337. //  if(xmlDoc == NULL)  
  338. //  {  
  339. //      return NULL;  
  340. //  }  
  341.       
  342.     //获得根元素  
  343.     //TiXmlElement *RootElement = xmlDoc->RootElement();  
  344.     if(RootElement == NULL)  
  345.     {  
  346.         cout << "解析错误,无法获取根元素" << endl;  
  347.         return NULL;  
  348.     }  
  349.       
  350.     TiXmlNode * pNode  = NULL;  
  351.     TiXmlNode * pSelectNode = NULL;  
  352.     string msg = "";  
  353.       
  354.     for(pNode=RootElement->FirstChildElement();pNode;pNode=pNode->NextSiblingElement())  
  355.     {  
  356.           
  357.         pSelectNode = selectChildNode(pNode,nodeName,nodeAttrName,nodeAttrValue);  
  358.         if(pSelectNode)  
  359.         {  
  360.             break;  
  361.         }  
  362.     }  
  363.       
  364.     if(pSelectNode)  
  365.     {  
  366.         //cout << "解析成功" << endl;  
  367.         //cout << pSelectNode->Value() << endl;  
  368.         return pSelectNode;  
  369.     }  
  370.     else  
  371.     {  
  372.         cout << "解析错误,无法获取节点" << endl;  
  373.         return NULL;  
  374.     }  
  375.       
  376. }  
  377.   
  378.   
  379. /************************************************************************/  
  380. /* 
  381.   根据父节点循环遍历查找子节点 
  382.   参数说明 
  383.     noteName 节点名 
  384.     noteAttrName 属性名 
  385.     noteAttrValue 属性值 
  386. /************************************************************************/  
  387. TiXmlNode * selectChildNode(TiXmlNode * pNode,string nodeName,string nodeAttrName,string nodeAttrValue)  
  388. {  
  389.     if(pNode == NULL)  
  390.     {  
  391.         return NULL;  
  392.     }  
  393.     TiXmlNode * pSelectedNode = NULL;  
  394.     TiXmlNode * pChildNode = NULL;  
  395.     int t = pNode->Type();  
  396.     switch (t)  
  397.     {  
  398.     case TiXmlText::TINYXML_DOCUMENT:  
  399.     case TiXmlText::TINYXML_DECLARATION:  
  400.     case TiXmlText::TINYXML_TEXT:  
  401.     case TiXmlText::TINYXML_UNKNOWN:  
  402.     case TiXmlText::TINYXML_COMMENT:  
  403.         break;  
  404.     case TiXmlText::TINYXML_ELEMENT:  
  405.     if(pNode->Value() == nodeName)  
  406.     {  
  407.             //cout << pNode->Value() << endl;  
  408.             if(!nodeAttrName.empty() && !nodeAttrValue.empty())  
  409.             {  
  410.                 TiXmlElement * pElement = pNode->ToElement();  
  411.   
  412.                 TiXmlAttribute * pAttr = pElement->FirstAttribute();  
  413.                 TiXmlAttribute * pNextAttr =NULL;  
  414.                 if(pAttr != NULL)  
  415.                 {     
  416.                     do  
  417.                     {                             
  418.                         if(pAttr->Name()==nodeAttrName&&pAttr->Value()== nodeAttrValue)  
  419.                         {  
  420.                             //cout << pAttr->Value() << endl;  
  421.                             return pNode;  
  422.                         }  
  423.                     }while(pAttr = pAttr->Next());  
  424.                 }  
  425.             }  
  426.             else  
  427.             {  
  428.                 return pNode;  
  429.             }  
  430.               
  431.         }  
  432.         else  
  433.         {  
  434.             //循环访问它的每一个元素  
  435.             for(pChildNode=pNode->FirstChild();  
  436.                 pChildNode!=0;  
  437.                 pChildNode = pChildNode->NextSibling())  
  438.             {  
  439.                 pSelectedNode = selectChildNode(  
  440.                                     pChildNode,  
  441.                                     nodeName,  
  442.                                     nodeAttrName,  
  443.                                     nodeAttrValue);  
  444.                 if(pSelectedNode)  
  445.                 {  
  446.                     return pSelectedNode;  
  447.                 }  
  448.             }  
  449.         }  
  450.   
  451.     default:break;  
  452.     }  
  453.     return NULL;  
  454. }  
  455.   
  456.   
  457.   
  458. /************************************************************************/  
  459. /* 普通插入一个节点,还不完善。                                                               */  
  460. /************************************************************************/  
  461. bool insert(const char * ccXmlName)  
  462. {  
  463.     //加载一个XML的文档对象。  
  464.     TiXmlDocument *myDocument = new TiXmlDocument(ccXmlName);  
  465.     myDocument->LoadFile();  
  466.       
  467.     if(myDocument == NULL)  
  468.     {  
  469.         return false;  
  470.     }  
  471.     //获得xml的头,即声明部分  
  472.     TiXmlDeclaration* decl = myDocument->FirstChild()->ToDeclaration();  
  473.     if(decl != NULL)  
  474.     {  
  475.         cout << "xml文件的版本是:" << decl->Version() << endl;  
  476.         cout << "xml的编码格式是:" << decl->Encoding() << endl;  
  477.     }  
  478.       
  479.   
  480.     //获得根元素  
  481.     TiXmlElement *RootElement = myDocument->RootElement();  
  482.       
  483.     if(RootElement != NULL)  
  484.     {  
  485.   
  486.         //创建一个Person元素并连接。  
  487.         TiXmlElement *PersonElement = new TiXmlElement("Person");  
  488.         PersonElement->SetAttribute("Id",1);  
  489.         RootElement->LinkEndChild(PersonElement);    
  490.           
  491.         TiXmlText *textElement = new TiXmlText("Jam");  
  492.         PersonElement->LinkEndChild(textElement);  
  493.           
  494.         //增加一个team元素  
  495.         TiXmlElement *TeamElement = new TiXmlElement("team");  
  496.         TeamElement->SetAttribute("TID","001");  
  497.         RootElement->LinkEndChild(TeamElement);  
  498.           
  499.         //增加team的子节点name  
  500.         TiXmlElement *teamName = new TiXmlElement("name");  
  501.         TiXmlText *nameText = new TiXmlText("workgroup");  
  502.         teamName->LinkEndChild(nameText);  
  503.         TeamElement->LinkEndChild(teamName);  
  504.   
  505.         //增加team的子节点type  
  506.         TiXmlElement *teamType = new TiXmlElement("type");  
  507.         TiXmlText *typeText = new TiXmlText("SI");  
  508.         teamType->LinkEndChild(typeText);  
  509.   
  510.         TeamElement->LinkEndChild(teamType);  
  511.   
  512.         myDocument->SaveFile("Person.xml");  
  513.           
  514.   
  515.         //输出根元素名称  
  516.         cout << RootElement->Value() << endl;  
  517.         return true;  
  518.     }  
  519.      return false;  
  520. }  
  521.   
  522.   
  523.   
  524. /************************************************************************/  
  525. /* 获取一个节点的属性                                                  */  
  526. /************************************************************************/  
  527. string getAttribute(TiXmlNode * pNode)  
  528. {  
  529.     if(pNode == NULL) return "";  
  530.     //输出属性  
  531.     string msg = "";  
  532.     TiXmlElement * pElement = pNode->ToElement();  
  533.   
  534.     TiXmlAttribute * pAttr = pElement->FirstAttribute();  
  535.     TiXmlAttribute * pNextAttr =NULL;  
  536.     string tmpAttrMsg = "";  
  537.   
  538.     if(pAttr != NULL)  
  539.     {     
  540.         string tmpAttrVal = "";  
  541.         string tmpAttrName = "";          
  542.   
  543.         do  
  544.         {                             
  545.             tmpAttrVal = pAttr->Value();  
  546.             tmpAttrName = pAttr->Name();  
  547.             tmpAttrMsg += "[" + tmpAttrName + "]=" + tmpAttrVal+"\n";   //各个属性之间用逗号分隔  
  548.         }while(pAttr = pAttr->Next());  
  549.           
  550.         //tmpAttrMsg = tmpAttrMsg.erase(tmpAttrMsg.find_last_of(","));  
  551.     }  
  552.   
  553.     //tmpAttrMsg += "]";  
  554.     msg += tmpAttrMsg;  
  555.   
  556.     return msg;  
  557. }  
  558.   
  559.   
  560.   
  561.   
  562. /************************************************************************/  
  563. /*  在指定位置插入一个元素                                             */  
  564. /************************************************************************/  
  565. bool insertAElement(const char * cXmlName, TiXmlElement * pElement)  
  566. {  
  567.     //加载一个XML的文档对象。  
  568.     TiXmlDocument *xmlDoc = new TiXmlDocument(cXmlName);  
  569.     xmlDoc->LoadFile();  
  570.   
  571.     if(xmlDoc == NULL)  
  572.     {  
  573.         return false;  
  574.     }  
  575.   
  576.     //获得xml的头,即声明部分  
  577.     TiXmlDeclaration* decl = xmlDoc->FirstChild()->ToDeclaration();  
  578.     if(decl != NULL)  
  579.     {  
  580.         cout << "xml文件的版本是:" << decl->Version()  << endl;  
  581.         cout << "xml的编码格式是:" << decl->Encoding() << endl;  
  582.     }  
  583.     //获得根元素  
  584.     TiXmlElement *RootElement = xmlDoc->RootElement();  
  585.     if(RootElement != NULL)  
  586.     {  
  587.         TiXmlNode * pNode = SelectSingleNode(cXmlName,"name","length","100");  
  588.         if(pNode == NULL)  
  589.         {  
  590.             return false;  
  591.         }  
  592.           
  593.         //创建一个Person元素并连接。  
  594.         TiXmlElement *pNewElement = new TiXmlElement("Person");  
  595.         if(pNewElement == NULL)  
  596.         {  
  597.             return false;  
  598.         }  
  599.         pNewElement->SetAttribute("Id","1");  
  600.         TiXmlText *textElement = new TiXmlText("gbnn");  
  601.         if(textElement == NULL)  
  602.         {  
  603.             return false;  
  604.         }  
  605.         pNewElement->LinkEndChild(textElement);  
  606.         TiXmlNode * pRet = pNode->InsertBeforeChild(pNode->LastChild(),*pNewElement);  
  607.         //TiXmlNode * pRet = pNode->LinkEndChild(pNewElement);  
  608.         xmlDoc->Print();  
  609.         bool b = xmlDoc->SaveFile();  
  610.         if(b)  
  611.         {  
  612.             cout << "添加成功" << endl;  
  613.             return b;  
  614.         }  
  615.         else  
  616.         {  
  617.             cout << "添加失败" << endl;  
  618.             return false;  
  619.         }  
  620.     }  
  621.     else  
  622.     {  
  623.         return false;  
  624.     }  
  625. }     
  626.   
  627. //const char * cXmlName,string strNodeName,string strNodeAttrName,string strNdeAttrValue,string strPath  
  628. /*! 
  629. *  \Function: 修改一个唯一节点中第二、三属性的值为一子符串 
  630. * 
  631. *  \param cXmlName       xml文件名 
  632. *  \param strNodeName    指定的节点名。 
  633. *  \param strNodeAttrName 指定的节点名所在节点中第一属性名。 
  634. *  \param strNdeAttrValue 指定的节点名所在节点中第一属性值。 
  635. *  \param strPath         字符串。为当前路径名的上一级目录的字符串 
  636. *  \return  是否成功。true为成功,false表示失败。 
  637. */  
  638. bool ModifySingleNode(const char * cXmlName,string strNodeName,string strNodeAttrName,string strNdeAttrValue,string strPath)  
  639. {  
  640.     if (strNodeName.empty() || strNodeAttrName.empty() || strNdeAttrValue.empty() ||strPath.empty())  
  641.     {  
  642.         return false;  
  643.     }  
  644.   
  645.     // 定义一个TiXmlDocument类指针  
  646.     TiXmlDocument *pDoc = new TiXmlDocument();  
  647.     if (NULL==pDoc)  
  648.     {  
  649.         return false;  
  650.     }  
  651.       
  652.     pDoc->LoadFile(cXmlName);  
  653.   
  654.     TiXmlElement* pRootElement = pDoc->RootElement();  
  655.   
  656.     TiXmlNode * pNode = SelectSingleNodeByRootEle(pRootElement,strNodeName,strNodeAttrName,strNdeAttrValue);  
  657.       
  658.     if (NULL == pNode)  
  659.     {  
  660.         return false;  
  661.     }  
  662.   
  663.     //输出属性  
  664.     TiXmlElement * pElement = pNode->ToElement();  
  665.   
  666.     TiXmlAttribute * pAttr = pElement->FirstAttribute();  
  667.     TiXmlAttribute * pNextAttr =NULL;  
  668.       
  669.     if(pAttr != NULL)  
  670.     {     
  671.         string tmpAttrVal = "";  
  672.         string tmpAttrName = "";          
  673.           
  674.         do  
  675.         {                             
  676.             tmpAttrVal = pAttr->Value();  
  677.             tmpAttrName = pAttr->Name();  
  678.               
  679.             //节点中第一个属性对跳过  
  680.             if (tmpAttrName == strNodeAttrName && tmpAttrVal == strNdeAttrValue)  
  681.             {  
  682.                 continue;  
  683.             }  
  684.   
  685.             //修改第二和第三个属性对  
  686.             if ("href" == tmpAttrName)  
  687.             {  
  688.                 pAttr->SetValue(strPath.c_str());  
  689.             }  
  690.   
  691.             if ("test" == tmpAttrName)  
  692.             {  
  693.                 pAttr->SetValue(strPath.c_str());  
  694.             }  
  695.   
  696.         }while(pAttr = pAttr->Next());  
  697.     }  
  698.       
  699.     pDoc->SaveFile("hhhhhhhhhhhhh.xml");  
  700.       
  701.     return true;  
  702. }  
  703.   
  704. void ShowSingleNode(const char * cXmlName,string strNodeName,string strNodeAttrName,string strNdeAttrValue)  
  705. {  
  706.     TiXmlNode * pNode = SelectSingleNode(cXmlName,strNodeName,strNodeAttrName,strNdeAttrValue);  
  707.       
  708.     if (NULL == pNode)  
  709.     {  
  710.         return;  
  711.     }  
  712.   
  713.     string strTem = getAttribute(pNode);  
  714.   
  715.     cout << strTem.c_str() << endl;  
  716. }  
  717.   
  718. string PathOpt()  
  719. {  
  720.     char cStr[MAX_NUM];  
  721.     GetCurrentDirectory(MAX_NUM,cStr);  
  722.   
  723.     string str = cStr;  
  724.       
  725.     //取当前路径的上一目录所在路径  
  726.     size_t pos = str.find_last_of("\\");  
  727.     str.erase(str.begin()+pos,str.end());  
  728.   
  729.     return str;  
  730. }  
  731.   
  732.   
  733. int main()  
  734. {  
  735.     const char * cXmlName = "files.xml";  
  736.     string strPath;  
  737.     //createXml(ccXmlName);  
  738.     //readXml(cXmlName);  
  739.     //insert(ccXmlName);  
  740.     //readXml(ccXmlName);  
  741.   
  742.     ShowSingleNode(cXmlName,"Document","title","About VMware Player Help");  
  743.       
  744.     strPath = PathOpt();  
  745.   
  746.     bool ret = ModifySingleNode(cXmlName,"Document","title","About VMware Player Help",strPath);  
  747.   
  748.     if (ret)  
  749.     {  
  750.         cout << "OK" << endl;  
  751.     }  
  752.     else  
  753.     {  
  754.         cout << "false" << endl;  
  755.     }  
  756.   
  757.     ShowSingleNode("hhhhhhhhhhhhh.xml","Document","title","About VMware Player Help");  
  758.     return 0;  
  759. }  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多