How to use Boost XML Parser

Viewed 1530

I have written an XML parser for reading an XML file and convert it to an object of my "Position" class. It works fine. Please take a look at its code below.

XML File:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE boost_serialization>
<boost_serialization signature="serialization::archive" version="15">
<position class_id="0" tracking_level="0" version="0">
    <Degrees>1</Degrees>
    <Minutes>2</Minutes>
    <Seconds>3</Seconds>
    <data class_id="1" tracking_level="0" version="0">
        <Degrees>1</Degrees>
        <Minutes>2</Minutes>
        <Seconds>3</Seconds>
    </data>
</position>
</boost_serialization>

Position Class:

#ifndef XMLMANAGER_POSITION_H
#define XMLMANAGER_POSITION_H

#include <boost/archive/xml_oarchive.hpp>
#include <boost/archive/xml_iarchive.hpp>

class Data
{
public:
    int Degrees;
    int Minutes;
    float Seconds;
private:
    friend class boost::serialization::access;

    template<class Archive>
    void serialize(Archive & ar, const unsigned int version){
        ar & BOOST_SERIALIZATION_NVP(Degrees);
        ar & BOOST_SERIALIZATION_NVP(Minutes);
        ar & BOOST_SERIALIZATION_NVP(Seconds);
    }
};
class Position
{

public:
    // every serializable class needs a constructor
    Position() {
        Degrees = 0;
        Minutes = 0;
        Seconds = 0;
    };
    Position(int degrees, int minutes, float seconds){
        Degrees = degrees;
        Minutes = minutes;
        Seconds = seconds;
    };
    int Degrees;
    int Minutes;
    float Seconds;
    Data data;

private:
    friend class boost::serialization::access;

    template<class Archive>
    void serialize(Archive & ar, const unsigned int version){
        ar & BOOST_SERIALIZATION_NVP(Degrees);
        ar & BOOST_SERIALIZATION_NVP(Minutes);
        ar & BOOST_SERIALIZATION_NVP(Seconds);
        ar & BOOST_SERIALIZATION_NVP(data);
    }
};

#endif //XMLMANAGER_POSITION_H

main Function:

    // Load an Object from XML
    std::ifstream ifs("/tests/r.karimi/XmlManager/data/Output.xml");
    boost::archive::xml_iarchive ixa(ifs);
    Position newPosition;
    try
    {
        ixa >> BOOST_SERIALIZATION_NVP(newPosition);
    }
    catch (std::exception const &ex)
    {
        std::cerr << ex.what() << std::endl;
    }
    std::cout << "Degree " << newPosition.Degrees <<
              " Minutes " << newPosition.Minutes <<
              " Seconds " << newPosition.Seconds << std::endl;
    std::cout << "Degree " << newPosition.data.Degrees <<
              " Minutes " << newPosition.data.Minutes <<
              " Seconds " << newPosition.data.Seconds << std::endl;

Now, I want to pasre the following XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE boost_serialization>
<boost_serialization signature="serialization::archive" version="15">
<position class_id="0" tracking_level="0" version="0">
    <Degrees>0</Degrees>
    <Minutes>0</Minutes>
    <Seconds>0.000000000e+00</Seconds>
    <data class_id="1" tracking_level="0" version="0">
        <Degrees>1</Degrees>
        <Minutes>2</Minutes>
        <Seconds>3</Seconds>
    </data>
    <data class_id="1" tracking_level="0" version="0">
        <Degrees>4</Degrees>
        <Minutes>5</Minutes>
        <Seconds>6</Seconds>
    </data>
</position>
</boost_serialization>

What should I do? I have tried different solution such as get an array of "Data" class in "Position" class, but it does not work. I prefer to use Boost library for my project. (Unless it is not possible!!!)

1 Answers
Related