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