我这里用的是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()打印不出那么多的精度,那是打印函数的问题,其实赋进去的值精度是没有变化的,只是打印不出来。