如何用VS读取XML文件内容?

时间:2024-05-30 21:11:12

步骤一:下载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读取XML文件内容?

    • VS2015的error LNK2038 RuntimeLibrary 不匹配问题的解决方案:

      • 工程上右击 → 属性 → C/C++ → 代码生成 → 运行库

      • 四个选项对应不同的含义,根据错误内容选择相应的运行库即可。

      • 多线程调试Dll (/MDd) → MD_DynamicDebug

      • 多线程Dll (/MD) → MD_DynamicRelease

      • 多线程(/MT) → MD_StaticRelease

      • 多线程(/MTd) → MD_StaticDebug
        如何用VS2015读取XML文件内容?

步骤二:创建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文件夹路径。
    如何用VS2015读取XML文件内容?

  • 链接器 → 输入 → 附加依赖项 → 加入.lib。
    如何用VS2015读取XML文件内容?

步骤四:代码验证

#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;
}