Подтвердить что ты не робот

Boost:: property_tree XML довольно печатает

Я использую boost:: property_tree для чтения и записи файлов конфигурации XML в моем приложении. Но когда я пишу файл, вывод выглядит вроде уродливым с большим количеством пустых строк в файле. Проблема в том, что он должен быть отредактирован людьми, поэтому я хотел бы получить лучший результат.

В качестве примера я написал небольшую тестовую программу:

#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 содержит:

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

после запуска программы file2.xml содержит:

<?xml version="1.0" encoding="utf-8"?>
<config>



    <net>



        <listenPort>10420</listenPort>
    </net>
</config>

Есть ли способ получить лучший результат, кроме того, что нужно вручную выполнять вывод и удалять пустые строки?

4b9b3361

Ответ 1

Решение заключалось в том, чтобы добавить флаг trim_whitespace к вызову 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;
}

Флаг зарегистрирован здесь, но текущий хранитель библиотеки (Sebastien Redl) был достаточно любезен, чтобы ответить и указать мне на него.

Ответ 2

Этот вопрос довольно старый, но я недавно исследовал вашу проблему, потому что теперь стало намного хуже, когда property_tree переводит символы новой строки в

&#10;    

По-моему, это ошибка, потому что элементы, содержащие только пробелы - новые строки, пробелы и вкладки, рассматриваются как текстовые элементы. trim_whitespace является только бандайдой и нормализует ВСЕ пробелы в свойстве property_tree.

Я сообщил об ошибке здесь, а также добавил .diff, чтобы исправить это поведение в Boost 1.59 в случае, если trim_whitespace не используется: https://svn.boost.org/trac/boost/ticket/11600

Ответ 3

Для тех, кто пытается:

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

Компиляция с boost-1.60.0 в VisualStudio 2013 вы можете получить:

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

Затем вернитесь сюда:

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

Решение найти работу - использовать std::string в шаблоне.

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

как описано здесь:

fooobar.com/info/192164/...