// ---------------------------------------------------------------------------- | |
// 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 <boost/property_tree/ptree.hpp> | |
#include <boost/property_tree/detail/xml_parser_write.hpp> | |
#include <boost/property_tree/detail/xml_parser_error.hpp> | |
#include <boost/property_tree/detail/xml_parser_writer_settings.hpp> | |
#include <boost/property_tree/detail/xml_parser_flags.hpp> | |
#include <boost/property_tree/detail/xml_parser_read_rapidxml.hpp> | |
#include <fstream> | |
#include <string> | |
#include <locale> | |
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 \<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); | |
} | |
/** | |
* 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<class Ptree> | |
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<class Ptree> | |
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<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); | |
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 |