现在的位置: 首页 > 综合 > 正文

C++ XML解析之TinyXML篇

2017年12月21日 ⁄ 综合 ⁄ 共 3975字 ⁄ 字号 评论关闭
  1. 最近使用TinyXML进行C++ XML解析,感觉使用起来比较简单,很容易上手,本文给出一个使用TinyXML进行XML解析的简单例子,很多复杂的应用都可以基于本例子的方法来完成。以后的文章里会讲解使用Xerces进行C++ XML解析的例子,希望大家一起交流。  
  2.   
  3. TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。  
  4.     DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。  
  5.     首先从网上下载TinyXML的库,文件夹的名字是TinyXpath,在工程里做如下配置:  
  6.     在附加包含路径里添加:你的tinyxpath路径/tinyxpath/include  
  7.     在附加库路径里添加:你的tinyxpath路径/tinyxpath/lib  
  8.     在对象/库路径里添加:tinyxpathd.lib,如果使用release版本,则是tinyxpath.lib。  
  9.     另外,由于我开发的项目是多线程的,所以设置了多线程的环境,因此使用TinyXML没有出现问题。本人将TinyXML写在一个单独的C++工程进行测试,发现如果不设置多线程的环境,会出现链接错误。我觉得原因可能是TinyXML使用了多线程环境,因此需要设置多线程的环境。在工程/设置下的C/C++选项卡中,选择Code Generation,在Use run-time library中选择Debug MultiThreaed DLL即可。  
  10.     本例的XML文件Students.xml如下:<Class name="计算机软件班">  
  11.   
  12.     <Students>  
  13.   
  14.         <student name="张三" studentNo="13031001" sex="男" age="22">  
  15.   
  16.             <phone>88208888</phone>  
  17.   
  18.             <address>西安市太白南路二号</address>  
  19.   
  20.         </student>  
  21.   
  22.         <student name="李四" studentNo="13031002" sex="男" age="20">  
  23.   
  24.             <phone>88206666</phone>  
  25.   
  26.             <address>西安市光华路</address>  
  27.   
  28.         </student>  
  29.   
  30.     </Students>  
  31.   
  32. </Class>  
  33. 复制代码程序代码XmlParseExample.cpp如下所示:#include <iostream>  
  34.   
  35. #include <string>
      
  36.   
  37. #include <tinyxml.h>
      
  38.   
  39.   
  40.   
  41.   using std::string;  
  42.   
  43.   
  44.   
  45. int main()  
  46.   
  47. {  
  48.   
  49.   TiXmlDocument* myDocument = new TiXmlDocument();  
  50.   
  51.   myDocument->LoadFile("Students.xml");  
  52.   
  53.   TiXmlElement* rootElement = myDocument->RootElement();  //Class
      
  54.   
  55.   TiXmlElement* studentsElement = rootElement->FirstChildElement();  //Students
      
  56.   
  57.   TiXmlElement* studentElement = studentsElement->FirstChildElement();  //Students
      
  58.   
  59.   while ( studentElement ) {  
  60.   
  61.     TiXmlAttribute* attributeOfStudent = studentElement->FirstAttribute();  //获得student的name属性
      
  62.   
  63.     while ( attributeOfStudent ) {  
  64.   
  65.       std::cout << attributeOfStudent->Name() << " : " << attributeOfStudent->Value() << std::endl;  
  66.   
  67.       attributeOfStudent = attributeOfStudent->Next();  
  68.   
  69.     }  
  70.   
  71.     TiXmlElement* phoneElement = studentElement->FirstChildElement();//获得student的phone元素
      
  72.   
  73.     std::cout << "phone" << " : " << phoneElement->GetText() << std::endl;  
  74.   
  75.     TiXmlElement* addressElement = phoneElement->NextSiblingElement();  
  76.   
  77.     std::cout << "address" << " : " << phoneElement->GetText() << std::endl;  
  78.   
  79.     studentElement = studentElement->NextSiblingElement();  
  80.   
  81.   }  
  82.   
  83.   delete myDocument;  
  84.   
  85.   return 0;  
  86.   
  87. }  
  88. 复制代码程序运行结果如下:  
  89. name : 张三  
  90. studentNo : 13031001  
  91. sex : 男  
  92. age : 22  
  93. phone : 88208888  
  94. address : 88208888  
  95. name : 李四  
  96. studentNo : 13031002  
  97. sex : 男  
  98. age : 20  
  99. phone : 88206666  
  100. address : 88206666  
  101.   
  102. 本例中使用的是对xml文件进行解析,很容易掌握,但是很多开发人员不知道如何对xml 字符流(非xml文件)进行解析,我看了TinyXML提供的源代码,里面可以使用如下方法对xml流解析。对应于上例,代码如下:string xmlString =   
  103.   
  104.             "<Class name=/"计算机软件班/">/  
  105.   
  106.               <Students>/  
  107.   
  108.                 <student name=/"张三/" studentNo=/"13031001/" sex=/"男/" age=/"22/">/  
  109.   
  110.                   <phone>88208888</phone>/  
  111.   
  112.                   <address>西安市太白南路二号</address>/  
  113.   
  114.                 </student>/  
  115.   
  116.                 <student name=/"李四/" studentNo=/"13031002/" sex=/"男/" age=/"20/">/  
  117.   
  118.                   <phone>88206666</phone>/  
  119.   
  120.                   <address>西安市光华路</address>/  
  121.   
  122.                 </student>/  
  123.   
  124.               </Students>/  
  125.   
  126.             </Class>";  
  127.   
  128.   TiXmlDocument* myDocument = new TiXmlDocument();  
  129.   
  130.   myDocument->Parse(xmlString.c_str());  
  131. 复制代码使用Parse函数就可以解析XML字符流了,这是很多开发者不太熟悉的情况。  
  132.   
  133.     如果开发者开发特定应用,就可以使用上述类似方法,可能不需要完全处理每一个属性,比如可以对属性名进行判断,只处理自己需要的属性,或者自己需要的xml元素。还可以使用TinyXML的方法创建xml元素和xml属性,或者设置xml元素和属性对应的值,等等,如果读者想要类似的例子,可以留言写出。  
  134.      下面介绍TinyXML的一些类。在TinyXML中,根据XML的各种元素来定义了一些类:  
  135. TiXmlBase:整个TinyXML模型的基类。   
  136. TiXmlAttribute:对应于XML中的元素的属性。  
  137. TiXmlNode:对应于DOM结构中的节点。  
  138. TiXmlComment:对应于XML中的注释  
  139. TiXmlDeclaration:对应于XML中的申明部分,<?versiong="1.0" ?>。  
  140. TiXmlDocument:对应于XML的整个文档。  
  141. TiXmlElement:对应于XML的元素。  
  142. TiXmlText:对应于XML的文字部分  
  143. TiXmlUnknown:对应于XML的未知部分。   
  144. TiXmlHandler:定义了针对XML的一些操作。   

抱歉!评论已关闭.