Search code examples
c++boostc++11boost-propertytreeenum-class

enum input from xml to c++ program using boost::property_tree


How do you read a enum-class from an XML file using the boost::property_tree library?

I would like to avoid reading it as a string and mapping the string to the enum-class in my program.


Solution

  • Read the property_tree/xml_parser.hpp header file. It's pretty straightforward.

    Here are the most important parts, all in the boost::property_tree::xml_parser namespace:

    /**
         * Reads XML from an input stream and translates it to property tree.
         * @note Clears existing contents of property tree.  In case of error the
         *       property tree unmodified.
         * @note XML attributes are placed under keys named @c \<xmlattr\>.
         * @throw xml_parser_error In case of error deserializing the property tree.
         * @param stream Stream from which to read in the property tree.
         * @param[out] pt The property tree to populate.
         * @param flags Flags controlling the behaviour of the parser.
         *              The following flags are supported:
         * @li @c no_concat_text -- Prevents concatenation of text nodes into
         *                          datastring of property tree.  Puts them in
         *                          separate @c \<xmltext\> strings instead.
         * @li @c no_comments -- Skip XML comments.
         * @li @c trim_whitespace -- Trim leading and trailing whitespace from text,
         *                           and collapse sequences of whitespace.
         */
        template<class Ptree>
        void read_xml(std::basic_istream<
                          typename Ptree::key_type::value_type
                      > &stream,
                      Ptree &pt,
                      int flags = 0)
        {
            read_xml_internal(stream, pt, flags, std::string());
        }
    
        /**
         * Reads XML from a file using the given locale and translates it to
         * property tree.
         * @note Clears existing contents of property tree.  In case of error the
         *       property tree unmodified.
         * @note XML attributes are placed under keys named @c \<xmlattr\>.
         * @throw xml_parser_error In case of error deserializing the property tree.
         * @param filename The file from which to read in the property tree.
         * @param[out] pt The property tree to populate.
         * @param flags Flags controlling the bahviour of the parser.
         *              The following flags are supported:
         * @li @c no_concat_text -- Prevents concatenation of text nodes into
         *                          datastring of property tree.  Puts them in
         *                          separate @c \<xmltext\> strings instead.
         * @li @c no_comments -- Skip XML comments.
         * @param loc The locale to use when reading in the file contents.
         */
        template<class Ptree>
        void read_xml(const std::string &filename,
                      Ptree &pt,
                      int flags = 0,
                      const std::locale &loc = std::locale())
        {
            BOOST_ASSERT(validate_flags(flags));
            std::basic_ifstream<typename Ptree::key_type::value_type>
                stream(filename.c_str());
            if (!stream)
                BOOST_PROPERTY_TREE_THROW(xml_parser_error(
                    "cannot open file", filename, 0));
            stream.imbue(loc);
            read_xml_internal(stream, pt, flags, filename);
        }