文档章节

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

傻呆
 傻呆
发布于 2016/06/22 10:09
字数 617
阅读 93
收藏 0

读取和设置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 plain copy
  1. <?xml version="1.0"?>  
  2. <Hello>World</Hello>  

创建main.cpp

[cpp]  view plain copy
  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.稍微复杂一些的例子

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

[html]  view plain copy
  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>  

[cpp]  view plain copy
  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 ) :获得下一个节点。

© 著作权归作者所有

傻呆
粉丝 1
博文 143
码字总数 138424
作品 0
成都
私信 提问
C++ XML 解析器:tinyxml

[tinyxml2]: http://www.grinninglizard.com/tinyxml2/index.html C++ XML 解析器:[tinyxml][tinyxml2] 1) [TinyXML-2][tinyxml2] 一个简单,轻量,高效的C++ XML 解析器,能够很容易得整合......

加壹
2014/04/24
2.1K
0
将“数据驱动”思想应用到cocos2d-x游戏Stop GMO

1.首先,数据驱动是什么? 这个问题,我不敢回答,因为我也是刚刚从《游戏编程精粹1》这本书上了解到的,我并不完全了解它。关于数据驱动的介绍,可以参考《游戏编程精粹1》的第一章第一节(...

萝卜胡
2013/01/13
1K
2
acl redis C++ 库被 redis 官方收录

acl 库中的新增模块 redis C++ 客户端库被 redis 官方正式收录,参见 http://redis.io/clients 中的 C++ 部分,其中 “redis-client for C++” 库即为 acl redis C++ 客户端库。acl 中的 re...

郑树新
2015/03/09
8.1K
10
TinyXML:一个优秀的C++ XML解析器

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

zmldndx
2013/10/10
1K
0
C++ 类库资源

原文:C++ 类库资源 作者:Breaker C/C++ 开发库 | C/C++ Development Library 这里收集一些著名的 C/C++ 开发库、SDK、类库、可复用类与结构代码 等信息,列举它们的介绍、参考和网站链接,...

晨曦之光
2012/05/23
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS7.6中安装使用fcitx框架

内容目录 一、为什么要使用fcitx?二、安装fcitx框架三、安装搜狗输入法 一、为什么要使用fcitx? Gnome3桌面自带的输入法框架为ibus,而在使用ibus时会时不时出现卡顿无法输入的现象。 搜狗和...

技术训练营
昨天
5
0
《Designing.Data-Intensive.Applications》笔记 四

第九章 一致性与共识 分布式系统最重要的的抽象之一是共识(consensus):让所有的节点对某件事达成一致。 最终一致性(eventual consistency)只提供较弱的保证,需要探索更高的一致性保证(stro...

丰田破产标志
昨天
8
0
docker 使用mysql

1, 进入容器 比如 myslq1 里面进行操作 docker exec -it mysql1 /bin/bash 2. 退出 容器 交互: exit 3. mysql 启动在容器里面,并且 可以本地连接mysql docker run --name mysql1 --env MY...

之渊
昨天
10
0
python数据结构

1、字符串及其方法(案例来自Python-100-Days) def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1)) # 13 # 获得字符串首字母大写的...

huijue
昨天
6
0
PHP+Ajax微信手机端九宫格抽奖实例

PHP+Ajax结合lottery.js制作的一款微信手机端九宫格抽奖实例,抽奖完成后有收货地址添加表单出现。支持可以设置中奖概率等。 奖品列表 <div class="lottery_list clearfix" id="lottery"> ......

ymkjs1990
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部