《转》 在C++中使用TinyXML2解析xml

读取和设置xml配置文件是最经常使用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,由于它的API接口和Java的十分类似。面向对象性非常好。
      TinyXML是一个开源的解析XML的解析库,可以用于C++,可以在Windows或Linux中编译。这个解析库的模型通过解析XML文件。然后在内存中生成DOM模型。从而让我们非常方便的遍历这棵XML树。


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

      只是官方的文档并非非常完好。样例更是不知所云...然后就有了以下的内容。

     这里用的是TinyXML2,相比于TinyXML1,它更小,更轻量,内存的使用也更加有效。

    1.配置TinyXML2

    去这里把项目弄下来。然后解压,我们之须要里面的tinyxml2.h和tinyxml2.cpp,将他们拷到project文件夹里面。


2.HelloWorld

在项目中创建test.xml,内容例如以下:

[html] view plaincopy
  1. <?xml version="1.0"?>  
  2. <Hello>World</Hello>  

创建main.cpp

  1. #include <iostream>  
  2. #include"tinyxml2.h"  
  3. using namespace std;  
  4. using namespace tinyxml2;  
  5. void example1()  
  6. {  
  7.     XMLDocument doc;  
  8.     doc.LoadFile("test.xml");  
  9.     const char* content= doc.FirstChildElement( "Hello" )->GetText();  
  10.     printf( "Hello,%s", content );  
  11. }  
  12.   
  13. int main()  
  14. {  
  15.     example1();  
  16.     return 0;  
  17. }  
编译执行:


3.略微复杂一些的样例

以下这个样例的场景更可能在project中遇到,就是在XML中存储一些数据。然后由程序来调用。

[html] view plaincopy
  1. <?xml version="1.0"?

    >  

  2. <scene name="Depth">  
  3.     <node type="camera">  
  4.         <eye>0 10 10</eye>  
  5.         <front>0 0 -1</front>  
  6.         <refUp>0 1 0</refUp>  
  7.         <fov>90</fov>  
  8.     </node>  
  9.     <node type="Sphere">  
  10.         <center>0 10 -10</center>  
  11.         <radius>10</radius>  
  12.     </node>  
  13.     <node type="Plane">  
  14.         <direction>0 10 -10</direction>  
  15.         <distance>10</distance>  
  16.     </node>  
  17. </scene>  

  1. #include <iostream>  
  2. #include"tinyxml2.h"  
  3. using namespace std;  
  4. using namespace tinyxml2;  
  5. void example2()  
  6. {  
  7.     XMLDocument doc;  
  8.     doc.LoadFile("test.xml");  
  9.     XMLElement *scene=doc.RootElement();  
  10.     XMLElement *surface=scene->FirstChildElement("node");  
  11.     while (surface)  
  12.     {  
  13.         XMLElement *surfaceChild=surface->FirstChildElement();  
  14.         const char* content;  
  15.         const XMLAttribute *attributeOfSurface = surface->FirstAttribute();  
  16.         cout<< attributeOfSurface->Name() << ":" << attributeOfSurface->Value() << endl;  
  17.         while(surfaceChild)  
  18.         {  
  19.             content=surfaceChild->GetText();  
  20.             surfaceChild=surfaceChild->NextSiblingElement();  
  21.             cout<<content<<endl;  
  22.         }  
  23.         surface=surface->NextSiblingElement();  
  24.     }  
  25. }  
  26. int main()  
  27. {  
  28.     example1();  
  29.     return 0;  
  30. }  

执行结果


解释一下几个函数:

FirstChildElement(const char* value=0):获取第一个值为value的子节点。value默认值为空,则返回第一个子节点。


RootElement():获取根节点,相当于FirstChildElement的空參数版本号。

const XMLAttribute* FirstAttribute() const:获取第一个属性值。

XMLHandle NextSiblingElement( const char* _value=0 ) :获得下一个节点。

posted @ 2017-05-08 10:11  cxchanpin  阅读(2005)  评论(0编辑  收藏  举报