天天看點

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);