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,一经查实,立即删除!

相关文章

java1.8.0,jdk1.8.0版本

【实例简介】jdk1.8版本&#xff0c;亲测可用。望有需求人士放心使用&#xff0c;下载。【实例截图】【核心代码】31449426-2a86-4e86-9718-9b4327dbb178└── jdk-8u161-windows-x64├── 1041│ ├── [5]DigitalSignature│ ├── [5]MsiDigitalSignatureEx│ ├─…

定制自己的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…

Spring Data JPA 从入门到精通~@Version处理乐观锁的问题

Version 处理乐观锁的问题 Version 乐观锁介绍 我们在研究 Auditing 的时候&#xff0c;发现了一个有趣的注解 Version&#xff0c;源码如下&#xff1a; package org.springframework.data.annotation; /*** Demarcates a property to be used as version field to impleme…

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

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

视频裁剪

用【格式工厂FFSetup190.exe】将视频文件格式专程AVI, 再用视频裁剪工具【SolveigMM AVI Trimmer】裁剪需要的段。 源文件-添加视频文件-填入开始时间和停止时间&#xff08;用三耳确定填写的时间值&#xff09;-按添加按钮-选择目的文件路径及名称-运行。 转载于:https://www.…

三星s9php禁用列表,ADB禁用列表

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼谷歌程序pm uninstall --user 0com.google.android.ext.servicespm uninstall --user 0com.google.android.onetimeinitializerpm uninstall --user 0com.google.android.ext.sharedpm uninstall --user 0com.google.android.confi…

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多路复用…

Spring Data JPA 从入门到精通~AliDruidDataSource的配置

AliDruid 配置方法 &#xff08;1&#xff09;在实际工作中&#xff0c;由于 HikariCP 和 Druid 应该各有千秋&#xff0c;会发现偏向于监控&#xff0c;有很多国内开发 者使用频次最高的 AliDruid&#xff0c;我们来看看看如何配置。 <!--druid--><dependency>&…

励志演讲

王国权励志演讲&#xff08;很有激情&#xff09;转载于:https://www.cnblogs.com/Xredman/archive/2009/07/23/1529186.html

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

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

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

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

windows 快捷键整理

Win10快捷键大全汇总&#xff1a;http://www.pc6.com/infoview/Article_110854.html 电脑键盘快捷键和组合键功能使用大全&#xff1a;http://product.pconline.com.cn/itbk/diy/mouse/1305/3298585.html 键盘上的键都有哪些用途&#xff1a;https://www.gezila.com/tutori…

我想知道怎么求N的N次方

我想知道怎么求N的N次方&#xff0c;这个数据是很大的&#xff0c;但是我要的是这个数据的最高位的数&#xff0c;应该有什么好的方法吧&#xff01; 请大侠们帮帮忙吧&#xff01;&#xff01;&#xff08;N <1000000000&#xff09; 这个问题提出后&#xff0c;fallening同…

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

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

php内容管理器是什么原因,有什么好的php内容管理后台吗?打算试水接单的大三狗提问...

国外优秀的CMS有drupal, joomla, wordpress, typo3drupal最专业&#xff0c;扩展强大&#xff0c;但最难入门&#xff1b;wordpress最简单&#xff0c;模板多&#xff0c;但难以实现高要求&#xff1b;joomla扩展多&#xff0c;入门简单&#xff0c;但后台组织比较混乱&#xf…

网络 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;套接字…