zoukankan      html  css  js  c++  java
  • 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用于存储轨迹数据。

  • 相关阅读:
    家庭记账本app进度之对于登录和注册两个界面点击按钮的相互跳转
    家庭记账本app进度之复选框以及相应滚动条的应用
    家庭版记账本app之常用控件的使用方法
    android 软件(app)之家庭版记账本首次进行helloword等相关测试
    家庭记账本app进度之android中AlertDialog的相关应用以及对日期时间的相关操作(应用alertdialog使用的谈话框)
    家庭版记账本app进度之关于android界面布局的相关学习
    家庭记账本app进度之关于单选按钮的相关操作(添加点击按钮事件以及点击单选更改事件)
    家庭记账本app进度之ui相关概念控制ui界面与布局管理
    家庭版记账本app进度之对于按钮的点击事件以及线性布局以及(alertdialog)等相关内容的应用测试
    乱了
  • 原文地址:https://www.cnblogs.com/WonderHow/p/4477154.html
Copyright © 2011-2022 走看看