c++ boost boost-propertytree

c++ - boost:: property_tree XML impresión bonita



boost-propertytree (3)

Esta pregunta es bastante antigua, pero investigué tu problema nuevamente, últimamente, porque empeoró mucho ahora que property_tree traduce nuevas líneas a




En mi opinión, esto es un error, porque los elementos, que solo contienen espacios en blanco (líneas nuevas, espacios y pestañas), se tratan como elementos de texto. trim_whitespace es solo un bandaid y normaliza TODOS los espacios en blanco en el property_tree.

Informé del error aquí y también adjunté un .diff para corregir este comportamiento en Boost 1.59 en caso de que no se use trim_whitespace: https://svn.boost.org/trac/boost/ticket/11600

Estoy usando boost :: property_tree para leer y escribir archivos de configuración XML en mi aplicación. Pero cuando escribo el archivo, el resultado se ve feo con muchas líneas vacías en el archivo. El problema es que se supone que también debe ser editado por humanos, por lo que me gustaría obtener un mejor resultado.

Como ejemplo, escribí un pequeño programa de prueba:

#include <boost/property_tree/ptree.hpp> #include <boost/property_tree/xml_parser.hpp> int main( void ) { using boost::property_tree::ptree; ptree pt; // reading file.xml read_xml("file.xml", pt); // 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; }

file.xml contiene:

<?xml version="1.0" ?> <config> <net> <listenPort>10420</listenPort> </net> </config>

después de ejecutar el programa file2.xml contiene:

<?xml version="1.0" encoding="utf-8"?> <config> <net> <listenPort>10420</listenPort> </net> </config>

¿Hay alguna manera de obtener un mejor resultado, que no sea pasar manualmente por la salida y eliminar líneas vacías?


La solución fue agregar el indicador trim_whitespace a la llamada a 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; }

La bandera está documentada here pero el actual mantenedor de la biblioteca (Sebastien Redl) tuvo la amabilidad de responder y señalarme.


Para aquellos que intentan:

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

Compilando con boost-1.60.0 en VisualStudio 2013 puede obtener:

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

Entonces termina aquí:

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

La solución para fundar es usar std :: string en la plantilla.

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

como se describe aquí:

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