boost::property_tree XML pretty printing

前端 未结 3 985
独厮守ぢ
独厮守ぢ 2020-12-02 13:12

I\'m using boost::property_tree to read and write XML configuration files in my application. But when I write the file the output looks kind of ugly with lots of empty lines

相关标签:
3条回答
  • 2020-12-02 14:11

    The solution was to add the trim_whitespace flag to the call to read_xml:

    #include <boost/property_tree/ptree.hpp>
    #include <boost/property_tree/xml_parser.hpp>
    
    int main( void )
    {
        // Create an empty property tree object
        using boost::property_tree::ptree;
        ptree pt;
    
        // reading file.xml
        read_xml("file.xml", pt, boost::property_tree::xml_parser::trim_whitespace );
    
        // writing the unchanged ptree in file2.xml
        boost::property_tree::xml_writer_settings<char> settings('\t', 1);
        write_xml("file2.xml", pt, std::locale(), settings);
    
        return 0;
    }
    

    The flag is documented here but the current maintainer of the library (Sebastien Redl) was kind enough to answer and point me to it.

    0 讨论(0)
  • 2020-12-02 14:12

    For those trying:

    boost::property_tree::xml_writer_settings<char> settings('\t', 1);
    

    Compiling with boost-1.60.0 in VisualStudio 2013 you may get:

    vmtknetworktest.cpp(259) : see reference to class template instantiation 'boost::property_tree::xml_parser::xml_writer_settings<char>' being compiled
    install\include\boost-1_60\boost/property_tree/detail/xml_parser_writer_settings.hpp(38): error C2039: 'value_type' : is not a member of '`global namespace''
    install\include\boost-1_60\boost/property_tree/detail/xml_parser_writer_settings.hpp(38): error C2146: syntax error : missing ';' before identifier 'Ch'
    install\include\boost-1_60\boost/property_tree/detail/xml_parser_writer_settings.hpp(38): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    install\include\boost-1_60\boost/property_tree/detail/xml_parser_writer_settings.hpp(40): error C2061: syntax error : identifier 'Ch'
    install\include\boost-1_60\boost/property_tree/detail/xml_parser_writer_settings.hpp(49): error C2146: syntax error : missing ';' before identifier 'indent_char'
    install\include\boost-1_60\boost/property_tree/detail/xml_parser_writer_settings.hpp(49): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    install\include\boost-1_60\boost/property_tree/detail/xml_parser_writer_settings.hpp(50): error C2825: 'Str': must be a class or namespace when followed by '::'
    install\include\boost-1_60\boost/property_tree/detail/xml_parser_writer_settings.hpp(50): error C2039: 'size_type' : is not a member of '`global namespace''
    install\include\boost-1_60\boost/property_tree/detail/xml_parser_writer_settings.hpp(50): error C2146: syntax error : missing ';' before identifier 'indent_count'
    install\include\boost-1_60\boost/property_tree/detail/xml_parser_writer_settings.hpp(50): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    vmtknetworktest.cpp(259): error C2661: 'boost::property_tree::xml_parser::xml_writer_settings<char>::xml_writer_settings' : no overloaded function takes 3 arguments
    

    Then end up here:

    https://svn.boost.org/trac/boost/ticket/10272

    Solution to found to work is to use std::string in template.

    pt::write_xml(file_name, params, std::locale(), pt::xml_writer_make_settings< std::string >(' ', 4));
    

    as described here:

    https://stackoverflow.com/a/35043551/7170333

    0 讨论(0)
  • 2020-12-02 14:14

    This question is quite old, but I investigated your problem again, lately, because it got a lot worse now that property_tree translates newlines to

    &#10;    
    

    In my opinion this is a bug, because elements, which contains only whitespace - newlines, spaces and tabs, are treated as text elements. trim_whitespace is only a bandaid and normalizes ALL whitespace in the property_tree.

    I reported the bug over here and also attached a .diff to fix this behaviour in Boost 1.59 in case trim_whitespace is not used: https://svn.boost.org/trac/boost/ticket/11600

    0 讨论(0)
提交回复
热议问题