// ---------------------------------------------------------------------------- // Copyright (C) 2002-2006 Marcin Kalicinski // Copyright (C) 2009 Sebastian Redl // // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // For more information, see www.boost.org // ---------------------------------------------------------------------------- #ifndef BOOST_PROPERTY_TREE_XML_PARSER_HPP_INCLUDED #define BOOST_PROPERTY_TREE_XML_PARSER_HPP_INCLUDED #include #include #include #include #include #include #include #include #include namespace boost { namespace property_tree { namespace xml_parser { /** * 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 \. * @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 \ 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 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 \. * @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 \ strings instead. * @li @c no_comments -- Skip XML comments. * @param loc The locale to use when reading in the file contents. */ template 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 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); } /** * Translates the property tree to XML and writes it the given output * stream. * @throw xml_parser_error In case of error translating the property tree to * XML or writing to the output stream. * @param stream The stream to which to write the XML representation of the * property tree. * @param pt The property tree to tranlsate to XML and output. * @param settings The settings to use when writing out the property tree as * XML. */ template void write_xml(std::basic_ostream< typename Ptree::key_type::value_type > &stream, const Ptree &pt, const xml_writer_settings< typename Ptree::key_type::value_type > & settings = xml_writer_settings< typename Ptree::key_type::value_type>() ) { write_xml_internal(stream, pt, std::string(), settings); } /** * Translates the property tree to XML and writes it the given file. * @throw xml_parser_error In case of error translating the property tree to * XML or writing to the output stream. * @param filename The file to which to write the XML representation of the * property tree. * @param pt The property tree to tranlsate to XML and output. * @param loc The locale to use when writing the output to file. * @param settings The settings to use when writing out the property tree as * XML. */ template void write_xml(const std::string &filename, const Ptree &pt, const std::locale &loc = std::locale(), const xml_writer_settings< typename Ptree::key_type::value_type > & settings = xml_writer_settings< typename Ptree::key_type::value_type>()) { std::basic_ofstream stream(filename.c_str()); if (!stream) BOOST_PROPERTY_TREE_THROW(xml_parser_error( "cannot open file", filename, 0)); stream.imbue(loc); write_xml_internal(stream, pt, filename, settings); } } } } namespace boost { namespace property_tree { using xml_parser::read_xml; using xml_parser::write_xml; using xml_parser::xml_parser_error; using xml_parser::xml_writer_settings; using xml_parser::xml_writer_make_settings; } } #endif