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数据,也是一种国际标准,解析方法如下:
StateCode ReadTrackFromGpx(Track* track,char* Path)
{
cout<<"开始解析gpx文件..."<<endl;
//读取gpx文件
TiXmlDocument xmlDoc( Path);
xmlDoc.LoadFile();
//指向根节点的元素指针
TiXmlElement* xmlRootElement;
//指向子节点的元素指针
TiXmlElement* xmlSubElement;
//节点属性
TiXmlAttribute* rootAttr ;
// TiXmlNode* pNode = NULL; //获取根节点
xmlRootElement = xmlDoc.RootElement();
if (xmlRootElement == NULL)
{
return ;
}
//cout<<"root element is:"<<xmlRootElement->Value()<<endl;
//根节点的属性
rootAttr = xmlRootElement->FirstAttribute();
//cout<<"There is its attributes:"<<endl;
while(rootAttr!= NULL)
{
//cout<<rootAttr->Name()<<":"<<rootAttr->Value()<<endl;
rootAttr = rootAttr->Next();
} xmlSubElement = xmlRootElement->FirstChildElement();
if (xmlSubElement == NULL)
{
return GPX_FILE_EMPTY;//gpx文件为空
}
while(xmlSubElement!=NULL)
{ if(strcmp(xmlSubElement->Value(),"trk")==)
break;
else
xmlSubElement = xmlSubElement->NextSiblingElement();
}
if (xmlSubElement == NULL)
{
return GPX_FILE_TRACK_NOEXIT;//gpx文件中不存在轨迹数据
}
//cout<<"Next is the Trajectory data:"<<endl; xmlSubElement = xmlSubElement->FirstChildElement();
while(xmlSubElement!=NULL)
{
if (strcmp(xmlSubElement->Value(),"trkseg")!=)
//输出name和number
cout<<xmlSubElement->Value()<<":"<<xmlSubElement->GetText()<<endl;
else
break;
xmlSubElement = xmlSubElement->NextSiblingElement();
} if (xmlSubElement == NULL)
{
return GPX_FILE_TRACK_NOEXIT;//gpx文件中不存在轨迹数据
} xmlSubElement = xmlSubElement->FirstChildElement();
rootAttr = xmlSubElement->FirstAttribute();
TiXmlElement* xmlNode=NULL;
while(xmlSubElement!=NULL)
{
trackpoint onepoint;
while(rootAttr!= NULL)
{
//输出经纬度
//cout<<rootAttr->Name()<<":"<<rootAttr->Value()<<endl;
if (strcmp(rootAttr->Name(),"lat")==)
onepoint.lat = stringToNum<double> (rootAttr->Value());
if (strcmp(rootAttr->Name(),"lon")==)
onepoint.lon = stringToNum<double> (rootAttr->Value());
rootAttr = rootAttr->Next();
}
xmlNode = xmlSubElement->FirstChildElement();
while (xmlNode!=NULL)
{
//高程(有的gpx文件中没有)和时间
//cout<<xmlNode->Value()<<":"<<xmlNode->GetText()<<endl;
if (strcmp(xmlNode->Value(),"ele")==)
onepoint.ele = stringToNum<double> (xmlNode->GetText());
if (strcmp(xmlNode->Value(),"time")==)
onepoint.time = xmlNode->GetText();
xmlNode = xmlNode->NextSiblingElement();
} xmlSubElement = xmlSubElement->NextSiblingElement();
if(xmlSubElement!=NULL)
rootAttr = xmlSubElement->FirstAttribute(); track->addPoint(onepoint);
}
track->setStarttime(track->getPointSet()[].time);//获取开始时间
track->setEndtime(track->getPointSet().back().time);//获取结束时间
cout<<"解析结束...";
xmlDoc.Clear();
return GPX_FILE_PASER_SUCCEED;
}
代码中track用于存储轨迹数据。