Str decode_char_entities(const Str &s) { typedef typename Str::value_type Ch; Str r; typename Str::const_iterator end = s.end(); for (typename Str::const_iterator it = s.begin(); it != end; ++it) { if (*it == Ch('&')) { typename Str::const_iterator semicolon = std::find(it + 1, end, Ch(';')); if (semicolon == end) BOOST_PROPERTY_TREE_THROW(xml_parser_error("invalid character entity", "", 0)); Str ent(it + 1, semicolon); if (ent == detail::widen<Str>("lt")) r += Ch('<'); else if (ent == detail::widen<Str>("gt")) r += Ch('>'); else if (ent == detail::widen<Str>("amp")) r += Ch('&'); else if (ent == detail::widen<Str>("quot")) r += Ch('"'); else if (ent == detail::widen<Str>("apos")) r += Ch('\''); else BOOST_PROPERTY_TREE_THROW(xml_parser_error("invalid character entity", "", 0)); it = semicolon; } else r += *it; } return r; }
std::basic_string<Ch> decode_char_entities(const std::basic_string<Ch> &s) { typedef typename std::basic_string<Ch> Str; Str r; typename Str::const_iterator end = s.end(); for (typename Str::const_iterator it = s.begin(); it != end; ++it) { if (*it == Ch('&')) { typename Str::const_iterator semicolon = std::find(it + 1, end, Ch(';')); if (semicolon == end) throw xml_parser_error("invalid character entity", "", 0); Str ent(it + 1, semicolon); if (ent == detail::widen<Ch>("lt")) r += Ch('<'); else if (ent == detail::widen<Ch>("gt")) r += Ch('>'); else if (ent == detail::widen<Ch>("amp")) r += Ch('&'); else throw xml_parser_error("invalid character entity", "", 0); it = semicolon; } else r += *it; } return r; }
void read_xml_internal(std::basic_istream<typename Ptree::key_type::value_type> &stream, Ptree &pt, int flags, const std::string &filename) { typedef typename Ptree::key_type::value_type Ch; // Create and load document from stream stream.unsetf(std::ios::skipws); if (!stream.good()) throw xml_parser_error("read error", filename, 0); std::vector<Ch> buf; std::copy(std::istream_iterator<Ch>(stream), std::istream_iterator<Ch>(), std::back_inserter(buf)); buf.push_back(0); // zero-terminate unsigned int pugi_flags = pugi::parse_w3c; if ( flags & no_comments ) pugi_flags = pugi_flags & ~pugi::parse_comments; pugi::xml_parser parser(&buf[0], pugi_flags); pugi::xml_node doc = parser.document(); // Create ptree from nodes Ptree local; for ( pugi::xml_node child = doc.first_child(); child; child = child.next_sibling()) read_xml_node( child, local, flags ); // Swap local and result ptrees pt.swap(local); }
void write_xml_internal(std::basic_ostream<typename Ptree::char_type> &stream, const Ptree &pt, const std::string &filename) { typedef typename Ptree::char_type Ch; typedef typename std::basic_string<Ch> Str; stream << detail::widen<Ch>("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"); write_xml_element(stream, Str(), pt, -1); if (!stream) throw xml_parser_error("write error", filename, 0); }
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); }
void write_xml_internal(std::basic_ostream<typename Ptree::key_type::value_type> &stream, const Ptree &pt, const std::string &filename, const xml_writer_settings<typename Ptree::key_type::value_type> & settings) { typedef typename Ptree::key_type::value_type Ch; typedef typename std::basic_string<Ch> Str; stream << detail::widen<Ch>("<?xml version=\"1.0\" encoding=\"") << settings.encoding << detail::widen<Ch>("\"?>\n"); write_xml_element(stream, Str(), pt, -1, settings); if (!stream) BOOST_PROPERTY_TREE_THROW(xml_parser_error("write error", filename, 0)); }
void write_xml(const std::string &filename, const Ptree &pt, const std::locale &loc = std::locale(), const xml_writer_settings< typename Ptree::key_type > & settings = xml_writer_settings<typename Ptree::key_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); }