您的位置:首页 > 编程语言 > C语言/C++

在C++中使用TinyXML2解析xml

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

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

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

      不过官方的文档并不是很完善,例子更是不知所云...然后就有了下面的内容。

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

    1.配置TinyXML2

    去这里把项目弄下来,然后解压,我们之需要里面的tinyxml2.h和tinyxml2.cpp,将他们拷到工程目录里面。

2.HelloWorld

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

[html] view
plaincopy

<?xml version="1.0"?>  

<Hello>World</Hello>  

创建main.cpp

[cpp] view
plaincopy

#include <iostream>  

#include"tinyxml2.h"  

using namespace std;  

using namespace tinyxml2;  

void example1()  

{  

    XMLDocument doc;  

    doc.LoadFile("test.xml");  

    const char* content= doc.FirstChildElement( "Hello" )->GetText();  

    printf( "Hello,%s", content );  

}  

  

int main()  

{  

    example1();  

    return 0;  

}  

编译运行:



3.稍微复杂一些的例子

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

[html] view
plaincopy

<?xml version="1.0"?>  

<scene name="Depth">  

    <node type="camera">  

        <eye>0 10 10</eye>  

        <front>0 0 -1</front>  

        <refUp>0 1 0</refUp>  

        <fov>90</fov>  

    </node>  

    <node type="Sphere">  

        <center>0 10 -10</center>  

        <radius>10</radius>  

    </node>  

    <node type="Plane">  

        <direction>0 10 -10</direction>  

        <distance>10</distance>  

    </node>  

</scene>  

[cpp] view
plaincopy

#include <iostream>  

#include"tinyxml2.h"  

using namespace std;  

using namespace tinyxml2;  

void example2()  

{  

    XMLDocument doc;  

    doc.LoadFile("test.xml");  

    XMLElement *scene=doc.RootElement();  

    XMLElement *surface=scene->FirstChildElement("node");  

    while (surface)  

    {  

        XMLElement *surfaceChild=surface->FirstChildElement();  

        const char* content;  

        const XMLAttribute *attributeOfSurface = surface->FirstAttribute();  

        cout<< attributeOfSurface->Name() << ":" << attributeOfSurface->Value() << endl;  

        while(surfaceChild)  

        {  

            content=surfaceChild->GetText();  

            surfaceChild=surfaceChild->NextSiblingElement();  

            cout<<content<<endl;  

        }  

        surface=surface->NextSiblingElement();  

    }  

}  

int main()  

{  

    example1();  

    return 0;  

}  

运行结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息