C++ 使用 TinyXml 解析 XML 文件

知乎  C++解析xml有什么好用的轮子? :https://www.zhihu.com/question/32046606

TinyXML-2 的 github地址和帮助文档:https://github.com/leethomason/tinyxml2

tinyxml 下载地址:https://sourceforge.net/projects/tinyxml/


*Please Note* that TinyXML development has stopped and all development has moved to TinyXML-2.



前言


TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译,使用TinyXML进行C++ XML解析,使用简单,容易上手。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。 DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。



TinyXML介绍


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

TiXmlBase:       整个TinyXML模型的基类。
TiXmlAttribute:  对应于XML中的元素的属性。
TiXmlNode:       对应于DOM结构中的节点。
TiXmlComment:    对应于XML中的注释。
TiXmlDeclaration:对应于XML中的申明部分,即<?versiong="1.0" ?>。
TiXmlDocument:   对应于XML的整个文档。
TiXmlElement:    对应于XML的元素。
TiXmlText:       对应于XML的文字部分。
TiXmlUnknown:    对应于XML的未知部分。 
TiXmlHandler:    定义了针对XML的一些操作


引用来自tinyXML文档



TiXmlBase是所有类的基类,TiXmlNode、TiXmlAttribute两个类都继承来自TiXmlBase类,其中TiXmlNode类指的是所有被<...>...<.../>包括的内容,而xml中的节点又具体分为以下几方面内容,分别是声明、注释、节点以及节点间的文本,因此在TiXmlNode的基础上又衍生出这几个类TiXmlComment、TiXmlDeclaration、TiXmlDocument、TiXmlElement、TiXmlText、TiXmlUnknown,分别用来指明具体是xml中的哪一部分。TiXmlAttribute类不同于TiXmlNode,它指的是在尖括号里面的内容,像<... ***=...>,其中***就是一个属性。


本地 F:\readXml.xml 内容如下: 

<?xml version="1.0" encoding="UTF-8"?>
<phonebook>   <!--one item behalfs one contacted person.-->  <people><name>one</name><addr>BeiJing</addr><tel>110</tel><email>110@gmail.com</email></people><people><name>two</name><addr>ShangHai</addr><tel>120</tel><email>120@gmail.com</email></people><!--more contacted persons.-->  
</phonebook>
  • 像TiXmlDeclaration指的就是<?xml version="1.0" encoding="UTF-8"?>,
    像TiXmlComment指的就是<!--one item behalfs one contacted person.-->、 <!--more contacted persons.-->,
    像TiXmlDocument指的就是整个xml文档,
    像TiXmlElement指的就是<phonebook>、<people>、<name>、<addr>等等这些节点,
    像TiXmlText指的就是‘one’、‘110’这些夹在<people>与</people>、<name>与</name>、<addr>与</addr>之间的文本文字,
    像TiXmlAttribute指的就是<?xml version="1.0" encoding="UTF-8"?>节点中version、encoding,
    除此之外就是TiXmlUnknown。



下载


TinyXML 下载地址:http://sourceforge.net/projects/tinyxml/

这个下载的 TinyXML,TinyXML 现在已经停止开发,不再支持。现在开发已经转到 TinyXML-2上。

TinyXML使用https://www.cnblogs.com/ggjucheng/archive/2012/01/03/2311426.html


到 github 上下载 TinyXML2,解压可以看到所有文件。只需要里面的tinyxml2.h和tinyxml2.cpp。把这两个文件拷到工程目录里面。


其中,docs 里面是 帮助文档,可以直接浏览器打开 index.html 查看帮助。
下面是 Related Pages 标签内容。可以看到,即可以从 文件导入 xml ,也可以从字符串里面导入xml。



引用文件


建一个自己的工程,把 tinyxml2.h 和 tinyxml2.cpp 加到自己的工程里面


main.cpp (注意:一定要加上 using namespace tinyxml2; 这个命名空间

#include <iostream>
#include <tinyxml2.h>using namespace std;
using namespace tinyxml2;void readXml()
{char* filepath="F:\\readXml.xml";XMLDocument doc;doc.LoadFile(filepath);doc.Print();
}int main(int argc, char *argv[])
{readXml();return 0;
}

运行结果:



示例


通过字符串导入xml

#include <iostream>
#include"tinyxml2.h"
using namespace std;
using namespace tinyxml2;void example1()
{static const char* testXML ="<?xml version=\"1.0\"?>""<Hello>World</Hello>";XMLDocument doc;doc.Parse(testXML); // 通过字符串导入xmlconst char* content= doc.FirstChildElement( "Hello" )->GetText();printf( "Hello,%s", content );
}int main()
{example1();return 0;
}


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

<?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 文件:

#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;  
}  


解释一下几个函数:
        FirstChildElement(const char* value=0):获取第一个值为value的子节点,value默认值为空,则返回第一个子节点。
        RootElement():获取根节点,相当于FirstChildElement的空参数版本;
        const XMLAttribute* FirstAttribute() const:获取第一个属性值;
        XMLHandle NextSiblingElement( const char* _value=0 ) :获得下一个节点。


更多使用,可以查看帮助文档。。。




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/496306.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

定制自己的Windows CE 5.0 ARM中文模拟器(转)

定制自己的Windows CE 5.0 ARM中文模拟器(转)http://showvi.com/Blog/ViewAirticle/59一、生成OS 1. 安装Windows CE 5.0&#xff08;记得CPU类型里把ARMV4I选上&#xff09;装完之后装DeviceEmulatorBSP.msi&#xff0c;这是ARMV4I模拟器的BSP。 我补充个DeviceEmulatorBSP.ms…

人工智能即服务 当人工智能遇到云计算

来源&#xff1a;企业网为了在竞争中保持领先地位&#xff0c;越来越多的企业正在寻求将人工智能技术整合到其应用程序、产品、服务&#xff0c;以及大数据分析方法中。而企业开始使用人工智能技术的最简单和最流行的方法之一是使用基于云计算的人工智能即服务产品。根据调研机…

Linux 文件 IO

参考&#xff1a;http://blog.csdn.net/wanxiao009/article/details/5648583 C 和 C 文件操作详解&#xff1a;http://blog.csdn.net/freeking101/article/details/60959624 标准IO与文件IO 的区别&#xff1a;http://blog.csdn.net/big_bit/article/details/51804391 参考…

Spring Data JPA 从入门到精通~默认数据源的讲解

默认数据源 spring.datasource.driver-class-namecom.mysql.jdbc.Driver spring.datasource.urljdbc:mysql://127.0.0.1:3306/test?useSSLfalse spring.datasource.usernameroot spring.datasource.password123456 但是在实际工作中不可能这么简单&#xff0c;因为会用其他数…

国内AI芯片百家争鸣,何以抗衡全球技术寡头

来源&#xff1a;中国科学院自动化研究所 作者&#xff1a;吴军宁如果说 2016 年 3 月份 AlphaGo 与李世石的那场人机大战只在科技界和围棋界产生较大影响的话&#xff0c;那么 2017 年 5 月其与排名第一的世界围棋冠军柯洁的对战则将人工智能技术推向了公众视野。阿尔法狗&am…

zabbix php 5.6 安装配置,CentOS 5.6下Zabbix 1.8.5 服务端安装部署

CentOS 5.6下Zabbix 1.8.5 服务端安装部署CentOS 5.6 x86_64 Zabbix 1.8.5IP:192.168.88.130一、安装LAMP环境依赖包&#xff1a;# yum install MySQL-server mysql-devel libcurl-devel net-snmp-devel php php-gd php-xml php-mysql php-mbstring php-bcmath httpd curl-dev…

Linux系统编程——I/O多路复用select、poll、epoll

参考&#xff1a;https://segmentfault.com/a/1190000003063859 Linux下的I/O复用与epoll详解&#xff1a;https://www.cnblogs.com/lojunren/p/3856290.html 彻底学会 epoll 系列&#xff1a;http://blog.chinaunix.net/uid/28541347/sid-193117-list-1.htm Linux下I/O多路复用…

谷歌X实验室的“无用”发明

来源&#xff1a;OFweek人工智能网摘要&#xff1a;作为想要改变世界的科技界钢铁侠&#xff0c;谷歌自诞生起就发明无数。1999年&#xff0c;公司创始人拉里佩奇用导航地图开车载他同事经过一个停车场时突然想到&#xff1a;在线搜索也可以盈利。当时他认为&#xff0c;谷歌能…

php跳一跳小游戏,原生JS实现的跳一跳小游戏完整实例

本文实例讲述了原生JS实现的跳一跳小游戏。分享给大家供大家参考&#xff0c;具体如下&#xff1a;以下说的是闲暇编写的一个小游戏--跳一跳&#xff0c;类似于微信的跳一跳&#xff0c;大体实现功能有&#xff1a;1.先随机生成地图&#xff1b;2.按住按钮释放后完成动作并进行…

Google提出新型学习范式「Deep Memory」,或将彻底改变机器学习领域

图源&#xff1a;pixabay原文来源&#xff1a;arXiv作者&#xff1a;Sylvain Gelly、Karol Kurach、Marcin Michalski、Xiaohua Zhai「雷克世界」编译&#xff1a;嗯~是阿童木呀、KABUDA导语&#xff1a;最近&#xff0c;Google提出了一种称之为Deep Memory的新型学习范式&…

网络 IPC 套接字socket

APUE书中所有实例源码下载地址&#xff1a;http://www.apuebook.com apue学习笔记&#xff08;第十六章 网络IPC&#xff1a;套接字&#xff09;&#xff1a;https://www.cnblogs.com/runnyu/p/4648678.html 一起学 Unix 环境高级编程 (APUE) 之 网络 IPC&#xff1a;套接字…

ASP.NET MVC V2 Preview 1 发布 期望VS有更好的表现

ASP.NET MVC V2 Preview 1官方首页&#xff1a;http://aspnet.codeplex.com/ 在这里可以下载 以下是网友的转载&#xff0c;介绍的还是比较详细的&#xff1a; 预览版是在.NET 3.5 SP1和VS 2008下工作的&#xff0c;可与ASP.NET MVC 1.0并行安装在同一个机器上&#xff08;即&a…

全球最权威的区块链行业报告

来源&#xff1a;腾讯研究院美国加密货币报道媒体CoinDesk近期发布“全球区块链现状报告”&#xff0c;深入研究了快速发展的加密货币行业及其底层技术&#xff0c;该报告覆盖了公共区块链、企业区块链、ICO、投资以及监管等话题&#xff0c;另外还对3000多名投资者的加密货币投…

Google 的 C++ 代码规范

Google 开源项目风格指南 (中文版)&#xff1a;https://zh-google-styleguide.readthedocs.io/en/latest/ 英文版&#xff1a;http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml 中文版&#xff1a;http://zh-google-styleguide.readthedocs.org/en/latest/goog…

NASA投资有远景技术,有望改变未来人类和机器人的勘探任务

来源&#xff1a; 机器人创新生态据NASA官网报道&#xff0c;美国宇航局(NASA)正在投资有远见的技术概念&#xff0c;包括流星撞击探测、太空望远镜群以及细小轨道碎片测绘技术&#xff0c;这些技术将来可能被用于未来的太空探索任务中。美国宇航局已经选出25个还处于早期的技术…

人工智能如何影响社会经济:关于近期文献的一个综述

作者&#xff1a;陈永伟 文章来源&#xff1a;经济学原理 相比于之前的历次技术进步&#xff0c;“人工智能革命”所引发的冲击更为巨大&#xff0c;其对经济学造成的影响也将更为广泛和深远。人工智能技术的突飞猛进&#xff0c;对经济社会的各个领域都产生了重大影响&#…

Spring Data JPA 从入门到精通~Naming命名策略详解及其实践

Naming 命名策略详解及其实践 用 JPA 离不开 Entity 实体&#xff0c;我都知道实体里面有字段映射&#xff0c;而字段映射的方法有两种&#xff1a; 显式命名&#xff1a;在映射配置时&#xff0c;设置的数据库表名、列名等&#xff0c;就是进行显式命名&#xff0c;即通过 C…

激光雷达:从光电技术角度看自动驾驶

来源&#xff1a; 传感器技术激光雷达和与之竞争的传感器技术&#xff08;相机、雷达和超声波&#xff09;加强了对传感器融合的需要&#xff0c;也对认真谨慎地选择光电探测器、光源和MEMS振镜提出了更高的要求。传感器技术、成像、雷达、光探测技术及测距技术&#xff08;激光…

socket的长连接、短连接、半包、粘包与分包

socket的半包&#xff0c;粘包与分包的问题和处理代码&#xff1a;http://blog.csdn.net/qq_16112417/article/details/50392463 知乎关于长连接和短连接&#xff1a;https://www.zhihu.com/search?typecontent&q长连接%20短连接 TCP网络通讯如何解决分包粘包问题&#…

2018年中国人工智能行业研究报告|附下载

来源&#xff1a;网络大数据、艾瑞咨询广义人工智能指通过计算机实现人的头脑思维所产生的效果&#xff0c;是对能够从环境中获取感知并执行行动的智能体的描述和构建;相对狭义的人工智能包括人工智能产业(包含技术、算法、应用等多方面的价值体系)、人工智能技术(包括凡是使用…