33

我正在使用 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>

除了手动通过输出并删除空行之外,有没有办法获得更好的输出?

4

3 回答 3

46

解决方案是将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) 很友好地回答并指出了它。

于 2011-07-07T17:07:01.007 回答
4

这个问题很老了,但最近我再次调查了你的问题,因为现在 property_tree 将换行符转换为

&#10;    

在我看来,这是一个错误,因为仅包含空格(换行符、空格和制表符)的元素被视为文本元素。trim_whitespace 只是一个创可贴,对 property_tree 中的所有空白进行规范化。

我在这里报告了这个错误,并附上了一个 .diff 来修复 Boost 1.59 中的这种行为,以防不使用 trim_whitespace: https ://svn.boost.org/trac/boost/ticket/11600

于 2015-09-03T08:15:46.173 回答
3

对于那些尝试:

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

在 VisualStudio 2013 中使用 boost-1.60.0 进行编译,您可能会得到:

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));

如此处所述:

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

于 2016-12-06T17:01:03.557 回答