天天看点

Boost学习之XML解析

很久以前为了解析正则表达式接触的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);