tinyXML的用法,用于解析gpx文件

tinyxml是一个开源的C++xml解析工具集,简单、轻量而又高效,所以对于处理xml文件是一个非常不错的选择。

由于它开源,所以可以方便地免费下载,下载地址百度一下很容易找到,这里就不多说了。

下载后将得到一个压缩包,解压后包含很多.h和.cpp文件,只需将其中六个复制到你自己的工程文件夹中即可:

tinyxml.h,

tinystr.h,

tinyxml.cpp,

tinyxmlerror.cpp,

tinyxmlparser.cpp,

tinystr.cpp

如果你使用VS作为开发工具,还需要在以上拷贝的cpp文件中加入#include "stdafx.h"语句。

接着在使用到tinyxml的地方包含:#include"tinyxml.h"   #include"tinystr.h"   即可

接下来就是开发部分,tinyxml的结构图如下:

下面我们举一个简单的例子来说明一下它的用法,本方法使用tinyxml解析gpx文件。gpx是一种xml文档,用于存储GPS数据,也是一种国际标准,解析方法如下:

  1 StateCode ReadTrackFromGpx(Track* track,char*  Path)
  2 {
  3      cout<<"开始解析gpx文件..."<<endl;
  4      //读取gpx文件
  5      TiXmlDocument xmlDoc( Path);
  6      xmlDoc.LoadFile();
  7      //指向根节点的元素指针
  8      TiXmlElement* xmlRootElement;
  9      //指向子节点的元素指针
 10      TiXmlElement* xmlSubElement;
 11      //节点属性
 12      TiXmlAttribute* rootAttr ;
 13     // TiXmlNode* pNode = NULL;
 14
 15      //获取根节点
 16     xmlRootElement = xmlDoc.RootElement();
 17     if (xmlRootElement == NULL)
 18     {
 19         return 1;
 20     }
 21     //cout<<"root element is:"<<xmlRootElement->Value()<<endl;
 22     //根节点的属性
 23      rootAttr = xmlRootElement->FirstAttribute();
 24     //cout<<"There is its attributes:"<<endl;
 25     while(rootAttr!= NULL)
 26     {
 27           //cout<<rootAttr->Name()<<":"<<rootAttr->Value()<<endl;
 28           rootAttr = rootAttr->Next();
 29     }
 30
 31     xmlSubElement  = xmlRootElement->FirstChildElement();
 32     if (xmlSubElement == NULL)
 33     {
 34         return GPX_FILE_EMPTY;//gpx文件为空
 35     }
 36     while(xmlSubElement!=NULL)
 37     {
 38
 39             if(strcmp(xmlSubElement->Value(),"trk")==0)
 40                    break;
 41             else
 42                 xmlSubElement = xmlSubElement->NextSiblingElement();
 43     }
 44     if (xmlSubElement == NULL)
 45     {
 46         return GPX_FILE_TRACK_NOEXIT;//gpx文件中不存在轨迹数据
 47     }
 48     //cout<<"Next is the Trajectory data:"<<endl;
 49
 50     xmlSubElement = xmlSubElement->FirstChildElement();
 51     while(xmlSubElement!=NULL)
 52     {
 53          if (strcmp(xmlSubElement->Value(),"trkseg")!=0)
 54              //输出name和number
 55              cout<<xmlSubElement->Value()<<":"<<xmlSubElement->GetText()<<endl;
 56          else
 57              break;
 58          xmlSubElement = xmlSubElement->NextSiblingElement();
 59     }
 60
 61     if (xmlSubElement == NULL)
 62     {
 63         return GPX_FILE_TRACK_NOEXIT;//gpx文件中不存在轨迹数据
 64     }
 65
 66     xmlSubElement = xmlSubElement->FirstChildElement();
 67     rootAttr = xmlSubElement->FirstAttribute();
 68     TiXmlElement* xmlNode=NULL;
 69     while(xmlSubElement!=NULL)
 70     {
 71         trackpoint onepoint;
 72         while(rootAttr!= NULL)
 73         {
 74             //输出经纬度
 75             //cout<<rootAttr->Name()<<":"<<rootAttr->Value()<<endl;
 76             if (strcmp(rootAttr->Name(),"lat")==0)
 77                 onepoint.lat = stringToNum<double> (rootAttr->Value());
 78             if (strcmp(rootAttr->Name(),"lon")==0)
 79                 onepoint.lon = stringToNum<double> (rootAttr->Value());
 80             rootAttr = rootAttr->Next();
 81          }
 82         xmlNode = xmlSubElement->FirstChildElement();
 83         while (xmlNode!=NULL)
 84         {
 85             //高程(有的gpx文件中没有)和时间
 86             //cout<<xmlNode->Value()<<":"<<xmlNode->GetText()<<endl;
 87             if (strcmp(xmlNode->Value(),"ele")==0)
 88                     onepoint.ele = stringToNum<double> (xmlNode->GetText());
 89             if (strcmp(xmlNode->Value(),"time")==0)
 90                 onepoint.time = xmlNode->GetText();
 91             xmlNode = xmlNode->NextSiblingElement();
 92         }
 93
 94         xmlSubElement = xmlSubElement->NextSiblingElement();
 95         if(xmlSubElement!=NULL)
 96                rootAttr = xmlSubElement->FirstAttribute();
 97
 98         track->addPoint(onepoint);
 99     }
100     track->setStarttime(track->getPointSet()[0].time);//获取开始时间
101     track->setEndtime(track->getPointSet().back().time);//获取结束时间
102     cout<<"解析结束...";
103     xmlDoc.Clear();
104     return GPX_FILE_PASER_SUCCEED;
105 }

代码中track用于存储轨迹数据。

时间: 2024-10-25 21:01:43

tinyXML的用法,用于解析gpx文件的相关文章

PHP-ExcelReader:用于解析excel文件的PHP类库

PHP-ExcelReader是一个基于PHP的开源项目,其作用在于解析excel文件. PHP-ExcelReader的官方网张如下: http://phpexcelreader.sourceforge.net/ 下载下来的文件结构如下图所示: 其中,Excel目录下的两个文件reader.php和oleread.inc是excel解析必须包含的文件,解析所需要的类与方法分别写在这两个文件之中.其它的,example.php和example2.php两个文件是示例程序,jxlwtest.xls

Python3解析dex文件

一.说明 1.1 背景说明 看<加密与解密>的时候反复听说"PE文件格式",到Android安全兴起就不断听说"dex文件格式".意思是看得懂的,但自己不能手解析一番总觉得不踏实,所以决定写个程序来解析一番. 本文其实算是姜维的Android逆向之旅---解析编译之后的Dex文件格式的Python实现版. 1.2 dex文件格式说明 类似exe文件是windows上的可执行文件,dex文件就是android中的可执行文件:pe格式是exe文件的格式,de

利用TinyXML解析XML文件

下载地址:TinyXML 解压缩TinyXML后,找到六个文件: tinystr.h.tinystr.cpp.tinyxml.h.tinyxml.cpp.tinyxmlerror.cpp.tinyxmlparser.cpp 将这六个文件放在你的C++工程中,跟你的源文件在同一目录下. 新建一个XML文件,命名为Students.xml : <Class name="计算机软件班"> <Students> <student name="张三&quo

Cocos2d-x 3.0 使用TinyXml 解析XML文件

在cocos2d-x 3.0中Xml解析已经不用自己找库了,已经为我们集成好了. text.xml <!--?xml version ="1.0" encoding ="UTF8" standalone="yes" ?--> <!--?xml-stylesheet type="text/xsl" href="yxfqust.xsl" ?--> <!--下面是一个学生名单--&g

Nginx、Apache解析php文件的区别

一.Apache是如何解析php文件的 我们常说的lamp架构是linux.apache.mysql.php,我们知道任何架构或者网站离不开数据库的支持,那么php和apache又是如何协同工作的呢? php是apache的一个外挂程序,必须依靠web服务器才可以运行.当客户端浏览器触发事件--->php程序提交到apache服务器---->apache服务器根据php程序的特点判断是php程序,并从内存或者硬盘中提取访问所需要的应用程序,将其提交给php引擎程序--->php引擎程序解

QT开发(六十二)———QT5解析Json文件

QT开发(六十二)---QT5解析Json文件 一.QT5 Json简介 QT4中使用第三方库QJson解析JSON文件. QT5新增加了处理JSON的类,类均以QJson开头,包含在QtCore模块中.QT5新增加六个相关类: QJsonArray 封装 JSON 数组 QJsonDocument 读写 JSON 文档 QJsonObject 封装 JSON 对象 QJsonObject::iterator 用于遍历QJsonObject的STL风格的非const遍历器 QJsonParseE

如何用Java解析CSV文件

首先看一下csv文件的规则: csv(Comma Separate Values)文件即逗号分隔符文件,它是一种文本文件,可以直接以文本打开,以逗号分隔.windows默认用excel打开.它的格式包括以下几点(它的格式最好就看excel是如何解析的.): ①每条记录占一行: ②以逗号为分隔符: ③逗号前后的空格会被忽略: ④字段中包含有逗号,该字段必须用双引号括起来: ⑤字段中包含有换行符,该字段必须用双引号括起来: ⑥字段前后包含有空格,该字段必须用双引号括起来: ⑦字段中的双引号用两个双引

解析Excel文件并把数据存入数据库

前段时间做一个小项目,为了同时存储多条数据,其中有一个功能是解析Excel并把其中的数据存入对应数据库中.花了两天时间,不过一天多是因为用了"upload"关键字作为URL从而导致总报同一个错,最后在同学的帮助下顺利解决,下面我把自己用"POI"解析的方法总结出来供大家参考(我用的是SpingMVC和hibernate框架). 1.web.xml中的配置文件 web.xml中的配置文件就按照这种方式写,只需要把"application.xml"换

使用dom4j创建和解析xml文件

使用dom4j创建和解析xml文件 在项目开发中,我们经常会遇到xml文件的创建和解析从别人接口得到的xml文件,而我们最常使用的组件是dom4j. 下面我就以代码来讲解一下如何使用dom4j来创建xml文件. 1.项目结构 在这里我们要,引入dom4j中的两个jar包,分别是: dom4j-1.6.1: jaxen-1.1-beta-6: 2.简要介绍 >创建xml 的主要类 DocumentHelper document = DocumentHelper.createDocument();