步骤一:下载tinyXml类库
-
C++中读写XML都会用到一个C++库tinyXml类库,这个类库可以直接下载,并解压,得到了一种6个源文件,其中4个cpp文件,2个h头文件。下载地址:https://sourceforge.net/projects/tinyxml/
-
将下载好的工程在VS2015中编译运行,生成静态链接库(.lib)。共有4个项目:
-
tinyxml
-
tinyxmlSTL
-
tinyXmlTest
-
tinyXmlTestSTL
-
-
后两个项目是测试项目,我们暂且不关注。前两个项目编译运行时出现以下问题:
-
VS2015文件加载使用简体中文(GB2312)问题解决方案:将文件通过Notepad++打开,改为我们想要的文件格式,“另存为“相应的路径(替代源文件)即可。
-
VS2015的error LNK2038 RuntimeLibrary 不匹配问题的解决方案:
-
工程上右击 → 属性 → C/C++ → 代码生成 → 运行库
-
四个选项对应不同的含义,根据错误内容选择相应的运行库即可。
-
多线程调试Dll (/MDd) → MD_DynamicDebug
-
多线程Dll (/MD) → MD_DynamicRelease
-
多线程(/MT) → MD_StaticRelease
-
多线程(/MTd) → MD_StaticDebug
-
-
步骤二:创建tinyXml文件夹
-
我们可以根据tinyXml版本号和VS版本号命名文件夹,方便我们查找,此处我的命名为:tinyXML_2_6_VS15。
-
文件夹中包含四个文件夹,在此说明:
-
include文件夹中放入.h文件。
-
src文件夹中放入.h文件对应的.cpp文件。
-
lib文件夹中放入步骤一中生成的.lib库。
-
example文件夹中放入剩余的.cpp文件。
-
步骤三:配置(release+X86/X64)
-
属性管理器 → Release|Win32 / Release|Win64 → 右击 Microsoft.Cpp.Win32.user / Microsoft.Cpp.Win64.user → 属性 → VC++目录 → 包含目录添加tinyXML_2_6_VS15文件夹中的include文件夹路径。
-
库目录添加tinyXML_2_6_VS15文件夹中的lib文件夹路径。
-
链接器 → 输入 → 附加依赖项 → 加入.lib。
步骤四:代码验证
#include<iostream>
#include<string>
#include<vector>
#include<tinystr.h>
#include<tinyxml.h>
using namespace std;
//box参数结构体
struct BoxSize
{
int xMin;
int yMin;
int xMax;
int yMax;
};
int main(int argc, char* argv[]) {
BoxSize pNode;
vector<BoxSize> vecNode;
//添加你所要访问的.xml文件路径
string m_strXmlPath = "E:\\VisualStudio\\readXml\\labels\\bcz-ng-d_0000.xml";
TiXmlDocument Document;
//读取xml文件中的参数值
if (!Document.LoadFile(m_strXmlPath.c_str()))
{
cout << "无法加载xml文件!" << endl;
return -1;
}
else
cout << "success" << endl;
TiXmlElement* RootElement = Document.RootElement(); //根目录
TiXmlElement* NextElement = RootElement->FirstChildElement(); //根目录下的第一个节点层
while (NextElement != NULL) //判断有没有读完
{
if (NextElement->ValueTStr() == "object") //读到object节点
{
TiXmlElement* BoxElement = NextElement->FirstChildElement();
while (BoxElement->ValueTStr() != "bndbox") //读到box节点
{
BoxElement = BoxElement->NextSiblingElement();
}
//索引到xmin节点
TiXmlElement* xminElemeng = BoxElement->FirstChildElement();
{
//分别读取四个数值
pNode.xMin = atof(xminElemeng->GetText());
TiXmlElement* yminElemeng = xminElemeng->NextSiblingElement();
pNode.yMin = atof(yminElemeng->GetText());
TiXmlElement* xmaxElemeng = yminElemeng->NextSiblingElement();
pNode.xMax = atof(xmaxElemeng->GetText());
TiXmlElement* ymaxElemeng = xmaxElemeng->NextSiblingElement();
pNode.yMax = atof(ymaxElemeng->GetText());
//加入到向量中
vecNode.push_back(pNode);
}
}
NextElement = NextElement->NextSiblingElement();
}
for (auto it : vecNode)
{
cout << it.xMin << " ";
cout << it.yMin << " ";
cout << it.xMax << " ";
cout << it.yMax << endl;
}
return 0;
}