Wonder奇迹奇迹

导航

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用于存储轨迹数据。

 

posted on 2015-05-04 20:10  Wonder奇迹奇迹  阅读(1163)  评论(0编辑  收藏  举报