本文主要介绍:C++利用库函数TinyXml,读取XML文件。
一、下载TinyXml库文件
TinyXml库文件比较简单,包含一个tinyxml.lib和两个tinyxml.h、tinystr.h文件,库文件下载地址:
http://download.csdn.net/detail/hong__fang/8411043
二、配置VS
<1>在工程目录下创建include文件夹,把两个.h文件放入include文件夹;
<2>在工程目录下创建lib文件夹,把lib文件放入lib文件夹;
<3>在属性页 配置属性->VC++目录->包含目录 中添加include路径;
<4>在属性页 配置属性->VC++目录->库目录 中添加lib路径;
<5>在属性页 链接器->输入->附加依赖项 中输入tinyxml.lib;
三、读取程序
假定要读取的XML如下:
<?xml version="1.0" encoding="gb2312"?> <Node> <Alg> <CName>监督分类参数</CName> <EngName>ImageProcessingParameters</EngName> </Alg> <Parameters> <InImg1 type="string" describe="待分类tif文件路径1">E:\GF1_WFV1_20140104_L1A0000145339_8_480_1131-1.tif</InImg1> <InImg2 type="string" describe="待分类tif文件路径2">E:\GF1_WFV1_20140104_L1A0000145339_8_480_1131-2.tif</InImg2> <InImg3 type="string" describe="待分类tif文件路径3">E:\GF1_WFV1_20140104_L1A0000145339_8_480_1131-3.tif</InImg3> <InImg4 type="string" describe="待分类tif文件路径4">E:\GF1_WFV1_20140104_L1A0000145339_8_480_1131-4.tif</InImg4> <AOItxtPath type="string" describe="txt样本路径">E:\1966427930086c.shp</AOItxtPath> <ShapePath type="string" describe="裁剪矢量路径">E:\\1966427930086c.shp</ShapePath> <ClassifyZero type="int" describe="是否忽略0值分类">0</ClassifyZero> <IpBand type="int[]" describe="参加运算的波段的状态">1111</IpBand> <OutImg type="string" describe="分类后输出图像的路径">E:\temp.tif</OutImg> <StatisticFile type="string" describe="分类统计结果文件">E:\temp.txt</StatisticFile> </Parameters> </Node>
先在cpp文件中,添加头文件 #include <tinyxml.h> ,读取程序如下:
ReadXML(CString XMLPath) { //char path[50]; // strcpy_s(path,XMLPath.c_str()); TiXmlDocument* Document = new TiXmlDocument(); Document->LoadFile(XMLPath);//加载JDclassify.xml if(Document==NULL) { AfxMessageBox("读取XML文件失败!"); return FALSE; } TiXmlElement* nodeElement=Document->RootElement();//获取根节点Node TiXmlElement* AlgElement=nodeElement->FirstChildElement();//获取Alg节点 TiXmlElement* ParElement=AlgElement->NextSiblingElement();//获取Parameters节点 TiXmlElement* FirstElement=ParElement->FirstChildElement();//获取Parameters节点的第一个孩子节点 int Flag,m_classifyzero; CString InimgBand1,InimgBand2,InimgBand3,InimgBand4,charfile,CutVectorPath,Outimgstatisticfile; while(FirstElement) { //cout<<FirstElement->Value()<<" : "<<FirstElement->GetText()<<endl; InimgBand1.Format("%s",FirstElement->GetText()); //波段1路径 FirstElement=FirstElement->NextSiblingElement(); //波段2路径 InimgBand2.Format("%s",FirstElement->GetText()); FirstElement=FirstElement->NextSiblingElement(); //波段3路径 InimgBand3.Format("%s",FirstElement->GetText()); FirstElement=FirstElement->NextSiblingElement(); //波段4路径 InimgBand4.Format("%s",FirstElement->GetText()); FirstElement=FirstElement->NextSiblingElement(); //样本文件路径 charfile.Format("%s",FirstElement->GetText()); FirstElement=FirstElement->NextSiblingElement(); //裁剪矢量路径 CutVectorPath.Format("%s",FirstElement->GetText()); FirstElement=FirstElement->NextSiblingElement(); m_classifyzero = atoi(FirstElement->GetText()); //是否忽略0值分类 FirstElement=FirstElement->NextSiblingElement(); Flag = atoi(FirstElement->GetText()); //选择参与运算波段 FirstElement=FirstElement->NextSiblingElement(); Outimg.Format("%s",FirstElement->GetText()); //输出图像路径 FirstElement=FirstElement->NextSiblingElement(); statisticfile.Format("%s",FirstElement->GetText()); //统计分类结果路径 break; } return TRUE; }
读取节点属性:
TiXmlElement *FirstElement = ParElement->FirstChildElement(); cout<<FirstElement->Value()<<endl; //获取节点名字 TiXmlAttribute *FirstAtt = FirstElement->FirstAttribute(); //获取属性 cout<<FirstAtt->Value()<<endl; FirstAtt = FirstAtt->Next(); //下一个属性 cout<<FirstAtt->Value()<<endl;