xml文件的C++读入

本文详细介绍了如何在Visual Studio 2015环境中安装和配置tinyXML库,以及如何使用该库进行XML文件的读取与解析。通过实例代码,展示了如何获取XML文件中的不同类型的属性值,如int、double和string,并处理了读取过程中可能遇到的错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我这里用的是VS2015,使用 tinyxml 但是也还是要装库:
1.下载一个tinyXML的压缩包,下载地址:https://sourceforge.net/projects/tinyxml/
打开并用现有的VS将tinyxml里面的两个工程tinyxml、tinyxmlSTL 用现有的VS环境跑一下,可能会遇到一些字符的错误,但是修改只需要将报错的地方的""加全即可,跑完之后得到.lib文件
2.新建一个文件tinyxml_vs_2015(里面包括四个小文件夹)
文件夹 include 里包括 tinyXML 里所有的头文件
文件夹 lib 将生成的.lib文件 全部放进去(我的包括tinyxmlSTL.lib文件与tinyxml.lib)
文件夹src中放入.h 对应的cpp文件
文件夹 example 放入剩余的cpp文件。
3.配置 (release+×86)
工程上右键->属性->VC++目录->在这里插入图片描述在包含目录上添加include文件夹的地址,在库目录上添加lib文件地址

链接器->输入->附加依赖性(加入lib文件)
在这里插入图片描述环境搭建完成
4.代码验证:
在这里插入图片描述
xml文件如下:根节点为:boost_serialization,它有两个属性 version与signature ,根节点的第一个孩子节点是 huibo_para,它有三个属性,version,tracking_level,class_id
xml 具体的文件介绍不说了,先上代码再解释:

class huibo_parametaer {//等于-1为初始化过程
public:
	int boost_s_version = -1;
	string boost_s_signature="";
	int huibo_version=-1;
	int huibo_tracking_level=-1;
	int huibo_class_id=-1;
	int Alg_type=-1;
	int OMP_thread=-1;
	double Simu_time=-1;
	int Echo_type=-1;
	string Echo_file="";
};

huibo_parametaer huibo_read(string file_add) { //file_add="E:/c#_code/C++/huajudll_test/input_huaju/"
	huibo_parametaer huibo;
	string huibo_xml = file_add+"huibo.xml";
	TiXmlDocument Document;
	//读取xml的参数值
	if (!Document.LoadFile(huibo_xml.c_str()))
	{
		std::cout << "无法加载xml文件!" << endl;
	//	return -1;
	}
	TiXmlHandle hDoc(&Document);
	TiXmlElement* ement = hDoc.FirstChildElement().Element();//指向根节点
	TiXmlHandle hRoot(ement);       // hRoot是根节点

	ement->QueryIntAttribute("version", &huibo.boost_s_version);
	if (ement->Attribute("signature") == NULL)
		huibo.boost_s_signature = "";
	else huibo.boost_s_signature = ement->Attribute("signature");

	//signature 没有读
	//进入 huibo_para
	ement = ement->FirstChildElement();
	ement->QueryIntAttribute("version", &huibo.huibo_version);
	ement->QueryIntAttribute("tracking_level", &huibo.huibo_tracking_level);
	ement->QueryIntAttribute("class_id", &huibo.huibo_class_id);
	//进入 huibo 的子节点 Alg_type
	ement = ement->FirstChildElement();
	huibo.Alg_type = atoi(ement->GetText());

	//进入 huibo 的子节点 OMP_thread
	ement = ement->NextSiblingElement();
	huibo.OMP_thread = atoi(ement->GetText());

	//进入 huibo 的子节点 Simu_time
	ement = ement->NextSiblingElement();
	huibo.Simu_time = strtod(ement->GetText(), NULL);
	//std::cout << huibo.Simu_time << endl;

	//进入 huibo 的子节点 Echo_type
	ement = ement->NextSiblingElement();
	huibo.Echo_type = atoi(ement->GetText());

	//进入 huibo 的子节点 Echo_file
	ement = ement->NextSiblingElement();
	if (ement->NextSiblingElement() == NULL)
		huibo.Echo_file = "";
	else  huibo.Echo_file = ement->GetText();

	//	std::cout << huibo.Echo_file << endl;

	free(ement);
	return huibo;
}

这是一个调用的函数块,其实大部分已经很明白了,关于元素属性的读法有几种,比如多个属性怎么读,有的属性为字符串,有的属性为int 类型,有的属性为double 类型

ement->QueryIntAttribute("version", &huibo.boost_s_version);
	if (ement->Attribute("signature") == NULL)
		huibo.boost_s_signature = "";
	else huibo.boost_s_signature = ement->Attribute("signature");

这段将属性version的值转换成int 类型储存,将boost_s_signature 就以字符串的形式储存,除了QueryIntAttribute外还有QuerydoubleAttribute等不同的转化类型

	//进入 huibo 的子节点 Simu_time
	ement = ement->NextSiblingElement();
	huibo.Simu_time = strtod(ement->GetText(), NULL);
	//std::cout << huibo.Simu_time << endl;

这是关于text里内容的读取,text里也有多种形式,有的以字符串,有的以int ,double类型读出来,strtod 是C++将字符串类型转换成double类型,atof() 将字符串类型转换成float,atoi()将字符类型转换成int类型,这个xml文件,基本遇到的情况都有了,没有遇到那种第二层多个节点的情况,遇到了再来加吧

在读的时候验证的时候遇到过一些问题,当xml里的某个节点的text为空的话,字符串等是不能赋予空值的的,其实需要做一个判断,还有当精度太高的时候,用cout或者printf()打印不出那么多的精度,那是打印函数的问题,其实赋进去的值精度是没有变化的,只是打印不出来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值