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

来源:互联网 发布:finereport数据查询 编辑:程序博客网 时间:2024/06/05 18:15
转载地址:


http://blog.csdn.net/zww0815/article/details/8083550


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

标签: stringnullxml文档vmwareencoding
7778人阅读 评论(5)收藏举报
本文章已收录于:
分类:
作者同类文章X
    作者同类文章X
      [cpp] view plain copy print?
      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
      原创粉丝点击