Пример #1
0
 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;
 }
Пример #2
0
 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;
 }
Пример #3
0
    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);
 }
Пример #5
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));
 }
Пример #7
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);
 }