C TinyXML使用心得总结
创始人
2024-06-22 07:51:07
0

C++语言是一种应用非常广泛的计算机应用编程语言。它支持多种程序设计风格,对程序员在实际开发中起了非常重要的作用。在这里我们先为大家介绍一个C++ XML解析器中叫做C++ TinyXML的解析器相关内容。

读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉C++ TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好。

C++ TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。

DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。

如下是一个XML片段:

  1. < Persons> 
  2. < Person ID="1"> 
  3. < name>周星星< /name> 
  4. < age>20< /age> 
  5. < /Person> 
  6. < Person ID="2"> 
  7. < name>白晶晶< /name> 
  8. < age>18< /age> 
  9. < /Person> 
  10. < /Persons> 

 

在C++ TinyXML中,根据XML的各种元素来定义了一些类:#t#

TiXmlBase:整个TinyXML模型的基类。

TiXmlAttribute:对应于XML中的元素的属性。

TiXmlNode:对应于DOM结构中的节点。

TiXmlComment:对应于XML中的注释

TiXmlDeclaration:对应于XML中的申明部分,即< ?versiong="1.0" ?>。

TiXmlDocument:对应于XML的整个文档。

TiXmlElement:对应于XML的元素。

TiXmlText:对应于XML的文字部分

TiXmlUnknown:对应于XML的未知部分。

TiXmlHandler:定义了针对XML的一些操作。

C++ TinyXML是个解析库,主要由DOM模型类(TiXmlBase、TiXmlNode、TiXmlAttribute、TiXmlComment、TiXmlDeclaration、TiXmlElement、TiXmlText、TiXmlUnknown)和操作类(TiXmlHandler)构成。它由两个头文件(.h文件)和四个CPP文件(.cpp文件)构成,用的时候,只要将(tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp)导入工程就可以用它的东西了。如果需要,可以将它做成自己的DLL来调用。举个例子就可以说明一切。。。

对应的XML文件:

  1. < Persons> 
  2. < Person ID="1"> 
  3. < name>phinecos< /name> 
  4. < age>22< /age> 
  5. < /Person> 
  6. < /Persons> 

 

读写XML文件的程序代码:

  1. #include < iostream> 
  2. #include "tinyxml.h"  
  3. #include "tinystr.h"  
  4. #include < string> 
  5. #include < windows.h> 
  6. #include < atlstr.h> 
  7. using namespace std;  
  8. CString GetAppPath()  
  9. {//获取应用程序根目录  
  10. TCHAR modulePath[MAX_PATH];  
  11. GetModuleFileName(NULL, modulePath, MAX_PATH);  
  12. CString strModulePath(modulePath);  
  13. strModulePathstrModulePath = strModulePath.Left
    (strModulePath.ReverseFind(_T('\\')));  
  14. return strModulePath;  
  15. }  
  16. bool CreateXmlFile(string& szFileName)  
  17. {//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false  
  18. try  
  19. {  
  20. //创建一个XML的文档对象。  
  21. TiXmlDocument *myDocument = new TiXmlDocument();  
  22. //创建一个根元素并连接。  
  23. TiXmlElement *RootElement = new TiXmlElement("Persons");  
  24. myDocument->LinkEndChild(RootElement);  
  25. //创建一个Person元素并连接。  
  26. TiXmlElement *PersonElement = new TiXmlElement("Person");  
  27. RootElement->LinkEndChild(PersonElement);  
  28. //设置Person元素的属性。  
  29. PersonElement->SetAttribute("ID", "1");  
  30. //创建name元素、age元素并连接。  
  31. TiXmlElement *NameElement = new TiXmlElement("name");  
  32. TiXmlElement *AgeElement = new TiXmlElement("age");  
  33. PersonElement->LinkEndChild(NameElement);  
  34. PersonElement->LinkEndChild(AgeElement);  
  35. //设置name元素和age元素的内容并连接。  
  36. TiXmlText *NameContent = new TiXmlText("周星星");  
  37. TiXmlText *AgeContent = new TiXmlText("22");  
  38. NameElement->LinkEndChild(NameContent);  
  39. AgeElement->LinkEndChild(AgeContent);  
  40. CString appPath = GetAppPath();  
  41. string seperator = "\\";  
  42. string fullPath = appPath.GetBuffer(0) +seperator+szFileName;  
  43. myDocument->SaveFile(fullPath.c_str());//保存到文件  
  44. }  
  45. catch (string& e)  
  46. {  
  47. return false;  
  48. }  
  49. return true;  
  50. }  
  51. bool ReadXmlFile(string& szFileName)  
  52. {//读取Xml文件,并遍历  
  53. try  
  54. {  
  55. CString appPath = GetAppPath();  
  56. string seperator = "\\";  
  57. string fullPath = appPath.GetBuffer(0) +seperator+szFileName;  
  58. //创建一个XML的文档对象。  
  59. TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());  
  60. myDocument->LoadFile();  
  61. //获得根元素,即Persons。  
  62. TiXmlElement *RootElement = myDocument->RootElement();  
  63. //输出根元素名称,即输出Persons。  
  64. cout < <  RootElement->Value() < <  endl;  
  65. //获得第一个Person节点。  
  66. TiXmlElement *FirstPerson = RootElement->FirstChildElement();  
  67. //获得第一个Person的name节点和age节点和ID属性。  
  68. TiXmlElement *NameElement = FirstPerson->FirstChildElement();  
  69. TiXmlElement *AgeElement = NameElement->NextSiblingElement();  
  70. TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();  
  71. //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。  
  72. cout < <  NameElement->FirstChild()->Value() < <  endl;  
  73. cout < <  AgeElement->FirstChild()->Value() < <  endl;  
  74. cout < <  IDAttribute->Value()< <  endl;  
  75. }  
  76. catch (string& e)  
  77. {  
  78. return false;  
  79. }  
  80. return true;  
  81. }  
  82. int main()  
  83. {  
  84. string fileName = "info.xml";  
  85. CreateXmlFile(fileName);  
  86. ReadXmlFile(fileName);  

C++ TinyXML解析器的相关使用方法就为大家介绍到这里。

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...