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