很久以前為了解析正規表達式接觸的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);