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