很久以前为了解析正则表达式接触的boost,最近项目中需要用到xml存贮数据,于是想到boost关于xml的支持。
于是研究了下,发现boost对于xml的支持还是比较方便的,在boost自带的例子当中,有对xml的读写操作。
本文里的例子更简单,仅仅是把对应的对象写入xml,再读出来复原,但是由此可以看出boost对xml读写的理念。
在boost中,只要定义一个类,实现serialize()方法,BOOST_SERIALIZATION_NVP()会帮你搞定一切,不论是写还是读。
2个project,分别是: demo_xml_save. demo_xml_load.
其中demo_xml_save生成和存贮XML。
demo_xml_load读取XML。
写入XML:
首先定义一个类,也就是要存放于XML的类:
class bus_test
{
friend class boost::serialization::access;
friend std::ostream & operator<<(std::ostream &os, const bus_test &bs);
template<class Archive>
void serialize(Archive &ar, const unsigned int version)
{
ar & BOOST_SERIALIZATION_NVP(nIndex) & BOOST_SERIALIZATION_NVP(strName);
ar & BOOST_SERIALIZATION_NVP(fSample);
}
private:
int nIndex;
std::string strName;
float fSample;
public:
bus_test(int _n, std::string _str, float _f)
:nIndex(_n), strName(_str), fSample(_f){}
bus_test(){};
};
其中serialize操作是吧成员写入XML,无视成员类型。
例子中把三个不同类型的成员写入。
写入XML主函数:
int main(int argc, char *argv[])
{
bus_test s(1, "dong", 3.14159);
std::string filename("..");
filename += "/demo.xml";
std::ofstream ofs(filename.c_str());
assert(ofs.good());
boost::archive::xml_oarchive oa(ofs);
oa << BOOST_SERIALIZATION_NVP(s);
return 0;
}
生成一个“demo.xml”的文件。
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE boost_serialization (View Source for full doctype...)>
- <boost_serialization signature="serialization::archive" version="4">
- <s class_id="0" tracking_level="0" version="0">
<nIndex>1</nIndex>
<strName>dong</strName>
<fSample>3.1415901</fSample>
</s>
</boost_serialization>
读取XML操作:
为了显示读取后的结果,给bus_test加上一个方法:
std::string name_show()
{
return strName;
}
读取XML主函数:
int main(int argc, char *argv[])
{
bus_test new_test;
std::string filename("..");
filename += "/demo.xml";
std::ifstream ifs(filename.c_str());
assert(ifs.good());
boost::archive::xml_iarchive ia(ifs);
// restore the schedule from the archive
ia >> BOOST_SERIALIZATION_NVP(new_test);
std::cout << new_test.name_show();
return 0;
}
运行结果:
Dong
移除XML文件:
std::remove(filename.c_str());
以上,实际上写入XML的关键语句就是:
oa << BOOST_SERIALIZATION_NVP(s);
以及其后的:
ar & BOOST_SERIALIZATION_NVP(nIndex) & BOOST_SERIALIZATION_NVP(strName);
ar & BOOST_SERIALIZATION_NVP(fSample);