相关链接:畅游C++ Boost Serialization 序列化
编译完成的tinyxml
编译完成的boost库
本博客将普通xml转成boost可读;
之前做项目,发现一个问题就是用boost生成的xml与tinyxml生成的xml格式不同,具体大概为这样:tinyxml与boost都是处理xml的工具:下图为tinyxml与boost读一个boost生成xml后重新生成的xml
(这里想展示的是格式上区别,其实还有点不同的是,就是科学计数法的方式,boost生成xml的格式数值自动就是科学计数法,而我们用普通方法的话是没有科学计数法的,之前我在c#用system.xml直接读写xml是没有科学计数法的,直接存在xml的数没有保留多少为有效数字)
格式区别:tinyxml会将<boost_serialization>识别成根节点,<bowei_para>是<boost_serialization>的子节点,而用boost时,<boost_serialization>并不是根节点,<bowei_para>才是根节点,所以boost生成的xml tinyxml是可以读的,但是tinyxml生成的xml boost不能读,为了格式一致,所以想将tinyxml生成的xml利用boost再重新成一次,想法:tinyxml(读)[boost生成的与tinyxml生成的xml都可读且正确],将数值存在内部的变量,然后用boost生成。
头文件在文前的链接里可下载:
//定义头文件(方法在问头链接:boost serialization入侵结构体)
//struct.h
#ifndef __SIMULATION_STRUCTURES_H_
#define __SIMULATION_STRUCTURES_H_
#include <iostream>
#include"boost\serialization\vector.hpp"
#include"boost\archive\xml_oarchive.hpp"
#include"boost\archive\xml_iarchive.hpp"
using namespace std;
class bowei_para
{
public:
bowei_para()
{
a = 0;
b = 0;
c = 0;
d = 0;
}
double a;
double b;
double c;
double d;
template<class Archive>
void serialize(Archive& archive, const unsigned int version)
{
archive & BOOST_SERIALIZATION_NVP(a);
archive & BOOST_SERIALIZATION_NVP(b);
archive & BOOST_SERIALIZATION_NVP(c);
archive & BOOST_SERIALIZATION_NVP(d);
}
};
//转换头文件 turnXml.h
#pragma once
#include <stdio.h>
#include <fstream>
#include <iostream>
#include <math.h>
#include <stdlib.h>
#include "tinystr.h"
#include "tinyxml.h"
#include <string>
#include "string.h"
#include"boost\serialization\vector.hpp"
#include"boost\archive\xml_oarchive.hpp"
#include"boost\archive\xml_iarchive.hpp"
#include "struct.h"
#include "turnXml.h"
using namespace std;
bowei_para bowei;
int turnXml_S(string file_add)
{
TiXmlDocument Document;
//读取xml的参数值
if (!Document.LoadFile(file_add.c_str()))
{
std::cout << "无法加载xml文件!" << endl;
// return -1;
}
TiXmlHandle hDoc(&Document);
TiXmlElement* ement = hDoc.FirstChildElement().Element();//指向根节点
TiXmlHandle hRoot(ement); // hRoot是根节点
//signature 没有读
//进入 bowei_para
ement = ement->FirstChildElement();
//进入 bowei 的子节点 a
ement = ement->FirstChildElement();
bowei.a = strtod(ement->GetText(), NULL);
//atoi(ement->GetText())转换成整数
//atof(ement->GetText())转换成浮点数,double类型
//strtod(ement->GetText(), NULL);double类型
//strtof(ement->GetText(), NULL);float类型
//进入 bowei 的子节点b
ement = ement->NextSiblingElement();
bowei.b = strtod(ement->GetText(), NULL);
//进入 bowei 的子节点c
ement = ement->NextSiblingElement();
bowei.c= strtod(ement->GetText(), NULL);
//进入 bowei 的子节点d
ement = ement->NextSiblingElement();
bowei.d = atoi(ement->GetText());
//boost开始写
std::ofstream file(file_add);
boost::archive::xml_oarchive oa(file);
oa & BOOST_SERIALIZATION_NVP(bowei);
return 1;
//生成名字为bowei的节点,然后在该节点下生成a,b,c,d四个子节点
}
可以生成dll,也可以生成exe,但是生成的dll在c#调用失败,所以我是C#调用的程序的方法完成了转写,之后会补充tinyxml与boost的包
错误提示:将tinyxml的所有.cpp放在工程里,不然可能会出错;此次编译环境:release x64